双下方法
__str__和__repr__
改变对象的字符串显示__str__,__repr__
obj.__str__ str(obj)
obj.__repr__ repr(obj)
class Teacher: def __init__(self,name,salary): self.name = name self.salary = salary def __str__(self): return "Teacher‘s object :%s"%self.name def __repr__(self): return str(self.__dict__) def func(self): return ‘wahaha‘ nezha = Teacher(‘哪吒‘,250) print(nezha) # 打印一个对象的时候,就是调用a.__str__ print(repr(nezha)) print(‘>>> %r‘%nezha)
repr 是str的备胎,但str不能做repr的备胎
print(obj)/‘%s‘%obj/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,那么他返回的必定是一个字符串
如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__。
repr(),只会找__repr__,如果没有找父类的
__del__
class A: def __del__(self): # 析构函数: 在删除一个对象之前进行一些收尾工作 self.f.close() a = A() a.f = open() # 打开文件 第一 在操作系统中打开了一个文件 拿到了文件操作符存在了内存中 del a # a.f 拿到了文件操作符消失在了内存中 del a # del 既执行了这个方法,又删除了变量 引用计数
__call__
构造方法的执行是由创建对象触发的,即:对象 = 类名() ;
而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class A: def __init__(self,name): self.name = name def __call__(self): ‘‘‘ 打印这个对象中的所有属性 :return: ‘‘‘ for k in self.__dict__: print(k,self.__dict__[k]) a = A(‘alex‘)()
__len__
class A: def __init__(self): self.a = 2 self.b = 2 def __len__(self): return len(self.__dict__) a = A() print(len(a)) 结果:2#计算字符串长度