知行编程网知行编程网  2022-10-10 09:30 知行编程网 隐藏边栏  25 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python __del__方法:销毁对象的相关知识,包括如何正确销毁照片,以及php销毁对象这些编程知识,希望对大家有参考作用。

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时,对象才会被回收。因此,如果一个对象有多个引用它的变量,删除其中一个变量将不会回收该对象。

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__() 方法,这样才能保证合理地回收父类实例的部分属性。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享