与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时,对象才会被回收。因此,如果一个对象有多个引用它的变量,删除其中一个变量将不会回收该对象。
class Item:
def __init__ (self, name, price):
self.name = name
self.price = price
# 定义析构函数
def __del__ (self):
print('del删除对象')
# 创建一个Item对象,将之赋给im变量
im = Item('鼠标', 29.8)
x = im # ①
# 打印im所引用的Item对象
del im
print('--------------')
程序重写了 Item 类的 __del__() 方法,它是 Item 类的析构函数。当系统即将回收Item时,系统会自动调用Item对象的__del__()方法。
上面的程序首先创建了一个 Item 对象,并将该对象赋值给 im 变量。代码 1 将 im 赋给变量 x,这样程序中有两个变量引用 Item 对象。接下来,程序执行del im代码删除im对象。 ,此时,由于仍有变量引用Item对象,程序不会回收Item对象。
运行上面程序,可以看到如下输出结果:
--------------
del删除对象
从上面程序的输出可以看出,执行del im后,程序并没有回收Item对象。只有当程序执行即将结束时(系统必须回收所有对象),系统才会回收Item对象。
如果将程序中的代码①注释掉,再次运行上述程序,会看到如下输出:
del删除对象
--------------
注释掉代码1后,当程序执行delim时,程序中不再有任何变量引用Item对象,所以系统会立即回收该对象,无需等到程序结束.
后需要说明的是,如果父类提供了 __del__() 方法,则系统重写 __del__() 方法时必须显式调用父类的 __del__() 方法,这样才能保证合理地回收父类实例的部分属性。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何查看python下载的库09/27
- ♥ python的def的作用是什么10/01
- ♥ Python中的OSI七层模型是什么12/23
- ♥ Python解决用户无意义输入的方法12/25
- ♥ 如何在python中定位css?11/15
- ♥ python属性使用操作详解01/12
内容反馈