python类定义了__del__方法,但是删除对象时没有调用它。
这有几个可能的原因。
del 语句不一定调用 __del__()
—— 它只是减少对象的引用计数,如果(引用计数)达到零,才会调用 __del__()
。
如果数据结构包含循环链接(例如,每个子级都有一个父级引用,每个父级都有一个子级列表的树),则引用计数将永远不会返回零。尽管Python 偶尔会运行一个算法来检测这样的循环,但在数据结构的引用计数清零后,垃圾收集器可能需要一段时间来运行,因此 __del__()
方法可能会在不方便和随机的时间被调用。这对于重现一个问题,是非常不方便的。更糟糕的是,对象 __del__()
的方法执行顺序是任意的。虽然可以运行 gc.collect()
来强制回收,但在一些病态的情况下,对象永远不会被回收。
尽管有循环收集器,但在对象上定义一个显式的 close()
方法以便在用完之后调用它仍然是一个好主意。 这样 close()
方法可以随即删除引用子对象的属性。 不要直接调用 __del__()
—— 应该由 __del__()
调用 close()
,并且 close()
能确保可以被同一对象多次地调用。
另一种避免循环引用的方法是使用 weakref
模块,该模块允许您指向对象而不增加其引用计数。例如,树状数据结构应该对其父级和同级引用使用弱引用(如果需要的话!)
最后,如果 __del__()
方法引发异常,会将警告消息打印到 sys.stderr
。
以上是 python类定义了__del__方法,但是删除对象时没有调用它。 的全部内容, 来源链接: utcz.com/z/520616.html