我的 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__() - 它只是简单地递减对象的引用计数,如果此计数达到零,则调用 __del__()。

  • __del__() 方法可能会在随机时间被调用。 - 如果你的数据结构包含循环链接,则引用计数将永远不会回到零。Python 运行一个算法来检测此类循环,但垃圾回收器可能会在对你的数据结构的最后一个引用消失后一段时间运行。

修复问题

以下是修复方法 -

  • 不要直接调用 __del__() - _del__() 应该调用 close(),而 close() 应该确保它可以对同一个对象多次调用。

  • 避免循环引用 - 使用 weakref 模块避免循环引用。它允许你指向对象而不增加它们的引用计数。weakref 模块也可用于获取类的实例

更新于: 2022-09-19

3K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告