我有一个我不控制的类,它没有实现自己的清理。我认为这是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))
我做错什么了吗?我误会了什么?
答案 0 :(得分:1)
不可能在weakref.finalize
中引用终结对象。 weakref.finalize
的“注释”部分中指出:
重要的是要确保func,args和kwargs不拥有任何 直接或间接引用obj,否则obj 永远不会被垃圾收集。特别地,func不应该是 obj的绑定方法。
因此,也无法使用weakref.finalize(obj, obj.close)
之类的绑定方法来进行清理。在这种情况下,您需要自己调用清理函数。另一种选择是从SomeClass
继承并制定适当的__del__
方法。