首页 > 解决方案 > 判断对象是否已经完成

问题描述

Python 3.4 中发生的GC 更改的一个影响是,被 gc 跟踪的对象只会__del__调用一次它的方法,即使第一次__del__调用会复活对象:

>>> class Foo(object):
...     def __del__(self):
...         print('__del__')
...         global x
...         x = self
... 
>>> x = Foo()
>>> del x
__del__
>>> del x
>>> 

(未跟踪的对象当前的行为不同,因为它们没有指示已完成状态的标志。您可以通过插入__slots__ = ()上面的类定义来看到这一点。我不确定这是错误还是已知和接受行为差异。)

出于调试目的,能够确定对象是否已__del__调用其方法将很有用。一种选择是在其中插入一个设置指示标志的行,但这需要提前准备,并且对于用C 编写的对象(例如生成器)__del__可能是不可能的。__del__

是否可以在不修改其方法的情况下确定对象是否已完成__del__

标签: pythongarbage-collectionfinalizer

解决方案


在 Python 3.9 中,可以使用gc.is_finalized(obj).


推荐阅读