Python类对象销毁的3种情况,python函数的用法
与init()方法相对应的是__del__()方法。__init__()方法用于初始化Python对象,而_ _ del _()方法用于销毁Python对象,即当任何一个Python对象即将被系统回收时,系统都会自动调用该对象的_ _ del _()方法。
当程序不再需要Python对象时,系统必须释放该对象占用的内存空间。这个过程称为垃圾收集(GC)。Python会自动回收所有对象占用的内存空间,开发者不需要关心垃圾回收的过程。
Python采用自动引用计数(ARC)来回收对象占用的空间。当程序中的变量引用Python对象时,
Python会自动保证这个对象的引用计数为1;当程序中有两个变量引用Python对象时,Python会自动保证对象的引用计数为2,
以此类推,如果一个对象的引用计数变成0,说明程序中不再有引用该对象的变量,说明程序不再需要该对象。
所以Python会回收对象。很多时候,Python的ARC可以准确高效地回收系统中的每一个对象。但如果系统中存在循环引用,比如对象A保存一个实例变量引用对象B,对象B保存另一个实例变量引用对象A,此时两个对象的引用计数都是1,但实际上程序中已经没有更多的变量引用它们了,所以系统应该回收它们。这时候Python的垃圾收集器可能就没那么快了,需要等待专门的循环垃圾收集器来检测回收这个参考循环。
当一个对象被垃圾回收时,Python会自动调用该对象的__del__方法。需要注意的是,你不应该假设一个变量引用的对象会通过对它执行del操作而被回收。只有当对象的引用计数变为0时,对象才会被回收。因此,如果一个对象有多个引用它的变量,那么del中的一个变量就不会回收这个对象。
类别项目:
def__init__(自身,姓名,价格):
self.name=name
self.price=价格
#定义析构函数
def__del__(self):
打印(“删除删除对象”)
#创建一个Item对象,并将其赋给im变量
Im=Item(鼠标,29.8)
x=im#
#打印im引用的项目对象
填入名称
在print ( -)程序中重写了Item类的__del__()方法,它是Item类的析构函数。当系统要回收该项时,系统会自动调用Item对象的_ _ del _()方法。
上面的程序先创建一个Item对象并赋给im变量,代码将im赋给变量X,这样程序中的两个变量就引用了Item对象。接下来,程序执行del im代码来删除im对象。此时,程序不会回收Item对象,因为还有其他变量引用Item对象。
运行上面的程序,您可以看到以下输出结果:
-
Del对象删除从上面程序的输出结果可以看出,执行del im后,程序并不回收Item对象。只有当程序执行即将结束时(系统必须回收所有对象),系统才会回收Item对象。
如果将程序中的代码注释掉,再次运行上述程序,将会看到以下输出结果:
删除删除对象
-代码被注释掉后,程序执行del im时,此时程序中已经没有变量引用Item对象了,所以系统会立即回收该对象,所以不需要等到程序结束。
后面需要注意的是,如果父类提供了__del__()方法,那么系统在重写__del_()方法时必须显式调用父类的__del__()方法,以保证父类实例的某些属性能够被合理恢复。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。