Python类定义了__del__
,但是在删除对象时却没有调用
__del__
是Python中的魔术方法。魔术方法允许我们在面向对象编程中做一些很酷的技巧。它们也被称为Dunder方法。这些方法由两个下划线(__
)作为前缀和后缀标识。
在Python中,我们使用__new__()
方法创建对象,并使用__init__()
方法进行初始化。然而,要销毁一个对象,我们需要使用__del__()
方法。
示例
让我们创建并删除一个对象 –
class Demo:
def __init__(self):
print("We are creating an object.");
# destructor
def __del__(self):
print("We are deleting an object.");
# Createing and deleting an object
ob = Demo();
del ob;
输出
We are creating an object.
We are deleting an object.
原因
然而,如果一个类定义了__del__
方法却在对象被删除时未被调用,原因可能有很多:
- del语句不一定会调用
__del__()
方法 ,它只是减少对象的引用计数,只有当引用计数为0时才会调用del()方法。 -
__del__()
方法可能会在随机的时间被调用 ,如果你的数据结构包含循环引用,引用计数将永远不会回到0。Python运行一个算法来检测这样的循环,但垃圾回收器可能在对数据结构的最后一个引用消失后的某个时刻运行。
修复问题
以下是解决方法:
-
不要直接调用
__del__()
方法 ,__del__()
方法应该调用close()方法,并且close()方法应确保可以被同一个对象调用多次。 -
避免循环引用 ,使用weakref模块来避免循环引用。它允许你引用对象而不增加其引用计数。weakref模块还可以用于获取类的实例。