1,__len__方法
class A: def __init__(self,name,age,sex,cls): self.name = name self.age = age self.sex = sex self.cls = cls def __len__(self): return len(self.__dict__) a=A("张三","男",18,6) print(len(a))
2,__hash__
class A: def __init__(self): self.a = 1 self.b = 2 def __hash__(self): return hash(str(self.a)+str(self.b)) a = A() print(hash(a))
3,__call__ 对象名() 相当于调用类内置的__call__, 一个对象是否可调用 完全取决于这个对象对应的类是否实现了__call__
class Teacher(): def __call__(self): print(123) t = Teacher() t()
4,__eq__ == 是由__eq__的返回值来决定的
class A: def __init__(self): self.a = 1 self.b = 2 def __eq__(self,obj): if self.a == obj.a and self.b == obj.b: return True a = A() b = A() print(a == b)
5,__del__ 析构方法,当对象在内存中被释放时,自动触发执行,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
class Foo: def __del__(self): print('执行我啦') f1=Foo() del f1 print('------->') #输出结果 执行我啦 ------->
6,__new__ 构造方法,该方法会创造一个对象,默认传一个类(cls)参数,执行完构造方法后,再执行__init__
单例模式:即一个类只能有一个实例
class B: __instance = None def __new__(cls, *args, **kwargs): if cls.__instance is None: obj = object.__new__(cls) cls.__instance = obj return cls.__instance def __init__(self,name,age): self.name = name self.age = age a = B('ads',18) b = B('egon',20) print(a) print(b) #打印的都是同一个内存地址 print(a.name) print(b.name)
7,__getitem__ __setitem__ __delitem__
class Foo: def __init__(self,name): self.name=name def __getitem__(self,item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): print('del obj[key]时,我执行') self.__dict__.pop(key) f = Foo('alex') # f.name = ... print(f['name']) # f.__getitem__('name') f['age'] = 18 # 赋值 print(f.age) # 自带的语法 print(f['age']) f['age'] = 80 # 修改 print(f['age']) # 通过实现__getitem__得到的 del f['age'] # 删除
8,__str__
print(obj) 的结果 是 obj.__str__()的结果,print替你将数据类型转化成字符串打印出来。
str(obj) 的结果 也是 obj.__str__()的结果。
'%s' %obj 的结果 也是 obj.__str__()的结果。
class List: def __init__(self,*args): self.l = list(args) def __str__(self): return '[%s]'%(','.join([str(i) for i in self.l])) l1 = List(1,2,3,4,5) print(l1) #--> l1.__str__() #print替你将数据类型转化成字符串打印出来 print(str(l1)) print('%s'%l1) #以上三种方式打印的内容相同
9,__repr__
repr(obj) 的结果和obj.__repr__()是一样的
'%r' %(obj)的结果和obj.__repr__()是一样的
class Teacher: def __init__(self,name,age): self.name = name self.age = age def __str__(self): return "Teacher's object %s"%self.name def __repr__(self): return 'repr function %s'%self.name a = Teacher('alex',80) b = Teacher('egon',80) print(a) print(b) print(repr(a)) # 相当于print(a.__repr__()) print('%r'%a) print(str(a)) # 打印str函数的返回值
10,,__str__ 和__repr__的区别
当需要使用__str__的场景时找不到 __str__就找__repr__
当需要使用__repr__的场景时找不到__repr__的时候就找父类的repr
11,__format__
class A: def __init__(self,name,school,addr): self.name = name self.school = school self.addr = addr def __format__(self,format_spec): return format_spec.format(obj=self) a = A('大表哥','oldboy','沙河') format_spec = '{obj.name}-{obj.addr}-{obj.school}' print(format(a,format_spec))