Python弱引用回调未触发且未销毁:强引用销毁后为何异常?
问题解答
1. 回调函数未执行的原因
你创建的弱引用指向的是Foo.bar对应的函数对象,但这个对象被类Foo本身持有强引用(它是类的属性)。即使将method设为None,只是减少了一个强引用,类Foo仍然存在,函数对象的引用计数并未降到0,因此不会被垃圾回收,弱引用的回调也就不会触发。
2. 弱引用未被销毁的原因
核心原因和上面一致:Foo.bar对应的函数对象还被类Foo强引用着,对象本身没有被回收,所以指向它的弱引用wr仍然有效,不会被销毁。
验证方法
如果想让弱引用触发回调,可以移除类对该函数的强引用,再手动触发垃圾回收:
def is_dead(wr): print("Callback function called!") class Foo(object): def bar(self): pass method = Foo.bar wr = weakref.ref(method, is_dead) # 删除类对bar方法的引用 del Foo.bar method = None # 手动触发垃圾回收 import gc gc.collect() print(wr()) # 输出None,说明弱引用已失效,回调已执行
内容的提问来源于stack exchange,提问作者20MikeMike
相关产品推荐
相关产品推荐

