python类定义了 __del__ 方法,但是删除对象时没有调用它。

python类定义了 __del__ 方法,但是删除对象时没有调用它。

这有几个可能的原因。

del 语句不一定调用 __del__() —— 它只是减少对象的引用计数,如果(引用计数)达到零,才会调用 __del__()

如果数据结构包含循环链接(例如,每个子级都有一个父级引用,每个父级都有一个子级列表的树),则引用计数将永远不会返回零。尽管Python 偶尔会运行一个算法来检测这样的循环,但在数据结构的引用计数清零后,垃圾收集器可能需要一段时间来运行,因此 __del__() 方法可能会在不方便和随机的时间被调用。这对于重现一个问题,是非常不方便的。更糟糕的是,对象 __del__() 的方法执行顺序是任意的。虽然可以运行 gc.collect() 来强制回收,但在一些病态的情况下,对象永远不会被回收。

尽管有循环收集器,但在对象上定义一个显式的 close() 方法以便在用完之后调用它仍然是一个好主意。 这样 close() 方法可以随即删除引用子对象的属性。 不要直接调用 __del__() —— 应该由 __del__() 调用 close(),并且 close() 能确保可以被同一对象多次地调用。

另一种避免循环引用的方法是使用 weakref 模块,该模块允许您指向对象而不增加其引用计数。例如,树状数据结构应该对其父级和同级引用使用弱引用(如果需要的话!)

最后,如果 __del__() 方法引发异常,会将警告消息打印到 sys.stderr

来源:PY学习网:原文地址:https://www.py.cn/article.html

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » python类定义了 __del__ 方法,但是删除对象时没有调用它。