Python-什么是__del__方法,如何调用?

发布于 2021-02-02 23:18:09

我正在阅读代码。有一个__del__定义方法的类。我发现此方法用于销毁该类的实例。但是,我找不到使用此方法的地方。这样做的主要原因是我不知道如何使用此方法,可能不是这样的:obj1.del()。那么,我的问题是如何调用该__del__方法?

关注者
0
被浏览
81
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    __del__是终结器。当对象被垃圾回收时调用该方法,该操作在删除该对象的所有引用之后的某个时间发生。

    在一个简单的情况下,这可能是在你说完之后,del x或者如果x是局部变量,则在函数结束之后。特别是,除非有循环引用,否则CPython(标准Python实现)将立即进行垃圾回收。

    但是,这是CPython 的实现细节。Python垃圾回收的唯一必需属性是,它在所有引用都被删除之后发生,因此这可能在此之后没有必要发生,也可能根本没有发生。

    此外,由于多种原因,变量可以生存很长时间,例如,传播异常或模块自省可以使变量引用计数保持大于0。此外,变量可以是引用循环的一部分-启用垃圾回收的CPython多数会中断,但不是全部,这样的周期,甚至只是周期性的。

    由于你不能保证它会被执行,因此永远不要将你需要运行的代码放入其中 __del__()-而是,该代码属于块的finally子句try或with语句中的上下文管理器。不过,也有有效的使用情况为__del__:例如,如果一个对象X的引用Y,也保留副本Y参考在全球cache(cache['X -> Y'] = Y),那么这将是对礼貌X.__del__也删除缓存条目。

    如果你知道析构函数提供了必要的清除操作(违反了上述准则),则你可能希望直接调用它,因为该方法没有什么特别之处:x.__del__()。显然,只有在知道不介意被两次调用的情况下,才应该这样做。或者,作为最后的选择,你可以使用重新定义此方法

    type(x).__del__ = my_safe_cleanup_method 
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看