Python 3.4中发生的GC changes的一个影响是,即使第一个__del__
调用复活,gc跟踪的对象也只会调用一次__del__
方法对象:
>>> class Foo(object):
... def __del__(self):
... print('__del__')
... global x
... x = self
...
>>> x = Foo()
>>> del x
__del__
>>> del x
>>>
(未跟踪对象目前的行为方式不同,因为它们没有指示已经完成状态的标志。您可以通过在上面的类定义中插入__slots__ = ()
来看到这一点。我不确定这是否是是一个错误或已知和接受的行为差异。)
出于调试目的,能够确定对象是否已调用其__del__
方法将非常有用。一种选择是在__del__
中插入一条设置指示标志的行,但这需要提前准备,而用C __del__
编写的对象可能无法生成,例如生成器。
是否可以确定对象是否已完成,而不修改其__del__
方法?
答案 0 :(得分:1)
在 Python 3.9 中,这可以使用 gc.is_finalized(obj)
进行测试。