【发布时间】:2019-02-18 23:15:24
【问题描述】:
我正在尝试使用weakref.finalize根据https://docs.python.org/3.6/library/weakref.html#comparing-finalizers-with-del-methods处理对象的销毁
但是,Python 的垃圾收集器从不收集对象,所以我无法测试我在做什么。 weakref.finalize 仅在脚本完成时被调用(参见atexit)。
但我不知道是什么阻止了垃圾收集。 请参阅以下示例:
import gc
from weakref import finalize, ref
import objgraph
def close_after_del(obj):
def _cleaner(obj_):
print("!object get's closed now")
obj_.close()
finalize(obj, _cleaner, obj)
print('open file')
fp = open('blub', 'w')
close_after_del(fp)
print('check for other references:')
objgraph.show_refs(fp)
print(gc.get_referrers(fp))
print('delete and collect it')
w_fp = ref(fp)
del fp
gc.collect()
print('check references again:')
print(gc.get_referrers(w_fp) if w_fp() is not None else "Weak reference is gone")
print("should be deleted by now but isn't")
objgraph.show_refs(w_fp)
objgraph 只显示不重要的弱引用(我只是在之后添加它以检查引用)。 gc.get_referrers 显示字典,这与globals 或locals 有关吗?
根据@user2357112的回答解决:
from weakref import finalize
def close_after_del(proxy, fp):
def _cleaner():
print("!object gets closed now!")
fp.close()
finalize(proxy, _cleaner)
class Proxy():
def __init__(self, fp):
self.fp = fp
print('open file')
proxy = Proxy(open('blub', 'w'))
close_after_del(proxy, proxy.fp)
print('delete and collect it')
del proxy
import gc; gc.collect()
print("Got collected!")
【问题讨论】:
-
w_fp是一个弱引用对象。它永远不会是None。 -
你说得对,我修好了
w_fp->w_fp()。 -
不过,您仍然会获得弱引用的引荐来源网址。