判断对象是否已经完成

Determine whether object has been finalized

Python 3.4 中发生的 GC changes 的一个影响是 gc-tracked 对象只会调用一次 __del__ 方法,即使第一个 __del__调用复活对象:

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

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

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

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

在Python 3.9中,可以使用gc.is_finalized(obj)进行测试。