Python解释器释放实例对象的时候,调用该对象的__del__方法
各个对象被被Python解释器释放对象的时候调用__del__方法
class Person(object): def __init__(self,name): self.name = name def __del__(self): print("实例对象:%s"%self.name,id(self)) print("python解释器开始回收%s对象了" % self.name) print("类对象",id(Person)) zhangsan = Person("张三") print("实例对象张三:",id(zhangsan)) print("------------") lisi = Person("李四") print("实例对象李四:",id(lisi))
执行效果
当使用del 把内存的所有应用删除,立刻调用__del__方法
执行效果
创建对象后,Python解释器默认调用__init__()方法;
当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法
import time class Animal(object): # 初始化方法 # 创建完对象后会自动被调用 def __init__(self, name): print('__init__方法被调用') self.__name = name # 析构方法 # 当对象被删除时,会自动被调用 def __del__(self): print("__del__方法被调用") print("%s对象马上被干掉了..."%self.__name) # 创建对象 dog = Animal("哈皮狗") # 删除对象 del dog cat = Animal("波斯猫") cat2 = cat cat3 = cat print("---马上 删除cat对象") del cat print("---马上 删除cat2对象") del cat2 print("---马上 删除cat3对象") del cat3 print("程序2秒钟后结束") time.sleep(2)
结果:
当有1个变量保存了对象的引用时,此对象的引用计数就会加1。
当使用del删除变量指向的对象时,如果对象的引用计数不会1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除
del xxx 不会主动调用__del__方法,只有引用计数 == 0时,__del__()才会被执行,并且定义了__del_()的实例无法被Python的循环垃圾收集器收集,所以尽量不要自定义__del__()。一般情况下,__del__() 不会破坏垃圾处理器。