为什么weakref不能在这个绑定方法上工作?

Asa*_*ers 11 python weak-references

我有一个项目,我试图使用带有回调的weakrefs,我不明白我做错了什么.我创建了简化测试,显示了我与之混淆的确切行为.

为什么在这个测试中test_a按预期工作,但self.MyCallbackB的weakref在类初始化和调用test_b之间消失了?我想只要实例(a)存在,对self.MyCallbackB的引用应该存在,但事实并非如此.

import weakref

class A(object):
    def __init__(self):

        def MyCallbackA():
            print 'MyCallbackA'
        self.MyCallbackA = MyCallbackA

        self._testA = weakref.proxy(self.MyCallbackA)
        self._testB = weakref.proxy(self.MyCallbackB)

    def MyCallbackB(self):
        print 'MyCallbackB'

    def test_a(self):
        self._testA()

    def test_b(self):
        self._testB()

if __name__ == '__main__':
    a = A()    
    a.test_a()
    a.test_b()
Run Code Online (Sandbox Code Playgroud)

Pan*_*rat 12

你想要一个WeakMethod.

解释为什么您的解决方案不起作用的解释可以在配方的讨论中找到:

正常的weakref.refs到绑定方法并不像人们期望的那样工作,因为绑定方法是第一类对象; weakrefs到bound方法是死的,除非存在对相同绑定方法的其他强引用.