Python __del__方法:销毁对象

与 init() 该方法对应于 __del__() 方法,__init__() 该方法用于初始化 Python 对象,而 __del__() 则用于销毁 Python 对象,即在任何地方 Python 当对象将被系统回收时,系统会自动调用对象 __del__() 方法。
当程序不再需要一个时 Python 当对象时,系统必须释放对象占用的内存空间,称为垃圾回收(GC,Garbage Collector),Python 所有物体占用的内存空间都会自动回收,因此开发者不需要关注物体垃圾回收的过程。
Python采用自动引用计数(ARC)在程序中引用Python对象时,可以回收对象占用的空间, Python将自动保证对象的引用计数为1;当Python对象在程序中引用两个变量时,Python会自动保证对象的引用计数为2, 以此类推,如果对象的引用计数变为0,则表示程序中不再有变量引用对象,表示程序不再需要对象, 所以Python会回收这个对象。
大多数时候,大多数时候,Python 的 ARC 系统中的每个对象都可以准确高效地回收。但是,如果系统中有循环引用,如对象 a 持有实例变量引用对象 b,而对象 b 又持有实例变量引用对象 a,此时,两个对象的引用计数都是 1.事实上,程序中没有变量引用它们,系统应该回收它们 Python 垃圾回收器可能没那么快,要等专门的回收垃圾回收器(Cyclic Garbage Collector)这种引用循环被检测和回收。
当物体被垃圾回收时,Python 对象将自动调用 __del__ 方法。需要注意的是,不要认为执行一个变量 del 操作时,变量引用的对象将被回收,只有当对象引用计数变成时 0 只有当对象被回收时,对象才会被回收。因此,如果一个对象引用多个变量,那么 del 其中一个变量不会回收对象。
classItem:
def__init__(self,name,price):
self.name=name
self.price=price
#定义分析函数
def__del__(self):
print('del删除对象')
#创建ITEM对象,并将其赋予IM变量
im=Item('鼠标',29.8)
x=im#①
#Item对象引用的打印im
delim
print('--------------')在程序中重写 Item 类的 __del__() 这种方法就是方法 Item 当系统将回收类的分析函数时 Item 当时,系统会自动调用 Item 对象的 __del__() 方法。
上述程序首先创建了一个 Item 对象并赋值对象 im 变量,① 号代码又将 im 赋值给变量 x,在这个程序中引用两个变量 Item 对象,下一个程序执行 del im 代码删除 im 此时,由于仍有变量引用对象 Item 因此,程序不会回收对象 Item 对象。
在操作上述程序时,可以看到以下输出结果:
-------------- del删除对象
从上述程序的输出结果可以看出,del im 执行之后,程序没有回收利用 Item 对象,只有在程序执行结束时(系统必须回收所有对象),系统才会回收 Item 对象。
假如在程序中 ① 注释号码代码,再次操作上述程序,将看到以下输出结果:
del删除对象 --------------
注释掉 ① 编号代码后,当程序执行时 del im 之后,程序中不再引用任何变量 Item 因此,系统会在程序结束前立即回收对象。
后来需要注意的是,如果父亲提供的话 __del__() 方法,系统重写 __del__() 在使用方法时,必须明确调用父类 __del__() 只有这样,父类实例的部分属性才能得到合理的回收。
