我正在阅读代码。有一个__del__定义方法的类。我发现此方法用于销毁该类的实例。但是,我找不到使用此方法的地方。这样做的主要原因是我不知道如何使用此方法,可能不是这样的:obj1.del()。那么,我的问题是如何调用该__del__方法?
__del__
obj1.del()
__del__是终结器。当对象被垃圾回收时调用该方法,该操作在删除该对象的所有引用之后的某个时间发生。
在一个简单的情况下,这可能是在你说完之后,del x或者如果x是局部变量,则在函数结束之后。特别是,除非有循环引用,否则CPython(标准Python实现)将立即进行垃圾回收。
del x
CPython
但是,这是CPython 的实现细节。Python垃圾回收的唯一必需属性是,它在所有引用都被删除之后发生,因此这可能在此之后没有必要发生,也可能根本没有发生。
Python
此外,由于多种原因,变量可以生存很长时间,例如,传播异常或模块自省可以使变量引用计数保持大于0。此外,变量可以是引用循环的一部分-启用垃圾回收的CPython多数会中断,但不是全部,这样的周期,甚至只是周期性的。
由于你不能保证它会被执行,因此永远不要将你需要运行的代码放入其中 __del__()-而是,该代码属于块的finally子句try或with语句中的上下文管理器。不过,也有有效的使用情况为__del__:例如,如果一个对象X的引用Y,也保留副本Y参考在全球cache(cache['X -> Y'] = Y),那么这将是对礼貌X.__del__也删除缓存条目。
__del__()
finally
with
X
Y
cache(cache['X -> Y'] = Y)
X.__del__
如果你知道析构函数提供了必要的清除操作(违反了上述准则),则你可能希望直接调用它,因为该方法没有什么特别之处:x.__del__()。显然,只有在知道不介意被两次调用的情况下,才应该这样做。或者,作为最后的选择,你可以使用重新定义此方法
x.__del__()
type(x).__del__ = my_safe_cleanup_method