如何在weakref.finalize中引用最终确定的对象?

时间:2018-10-04 13:48:19

标签: python python-3.6 weak-references

我有一个我不控制的类,它没有实现自己的清理。我认为这是weakref.finalize适用的情况之一,但我无法使其正常工作。

def cleanup(obj):
    print('Cleanup obj')
    if not obj.is_closed:
        obj.close()
...

def make_obj():
    obj = SomeClass()

    # this creates an extra ref, so cleanup is never run
    weakref.finalize(obj, cleanup, obj)

    # this always results in ReferenceError; obj is already gone when cleanup is called
    weakref.finalize(obj, cleanup, weakref.proxy(obj))  

我做错什么了吗?我误会了什么?

1 个答案:

答案 0 :(得分:1)

不可能在weakref.finalize中引用终结对象。 weakref.finalize的“注释”部分中指出:

  

重要的是要确保func,args和kwargs不拥有任何   直接或间接引用obj,否则obj   永远不会被垃圾收集。特别地,func不应该是   obj的绑定方法。

因此,也无法使用weakref.finalize(obj, obj.close)之类的绑定方法来进行清理。在这种情况下,您需要自己调用清理函数。另一种选择是从SomeClass继承并制定适当的__del__方法。