确定对象是否已最终确定

时间:2018-06-15 20:43:34

标签: python garbage-collection finalizer

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

1 个答案:

答案 0 :(得分:1)

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