确定对象是否已被终结。

3

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__方法?

文档是否在3.6之后没有更新?根据这个链接,似乎__del__方法是否可以被调用两次仍然是一个实现细节。 - user3483203
不太确定您打算何时以及如何检查对象是否已完成。检查变量是否仍存在于“globals()”中的“'x'”不是一个选项吗? - Gabriel Jablonski
@user3483203:PEP并没有将其作为实现细节呈现出来,也不像它是旨在成为实现细节,但我猜它被记录为实现细节。 - user2357112
我同意它似乎并不是旨在成为一个。例如,在gc文档中,他们引用PEP,而不是作为实现细节。 - user3483203
1
@Gabriel:不行。这不能区分x = Foo()之后的状态和第一次del x之后的状态。而且,即使它起作用,也不能推广到其他类型。 - user2357112
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接