判断对象是否已经完成
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)
进行测试。
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)
进行测试。