Python 3.4中发生的GC变化之一的影响是,即使第一个__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__
方法?
__del__
方法是否可以被调用两次仍然是一个实现细节。 - user3483203gc
文档中,他们引用PEP,而不是作为实现细节。 - user3483203x = Foo()
之后的状态和第一次del x
之后的状态。而且,即使它起作用,也不能推广到其他类型。 - user2357112