当前位置: 首页 > 面试题库 >

为什么weakref在此绑定方法上不起作用?

范弘亮
2023-03-14
问题内容

我有一个项目,我试图在回调中使用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()

问题答案:

您需要一个WeakMethod。

在食谱的讨论中,可以找到您的解决方案不起作用的解释:

普通的对绑定方法的weakref.refs不能像人们期望的那样正常工作,因为绑定方法是一流的对象。除非存在对同一绑定方法的其他一些强引用,否则
对绑定方法的weakref会死机



 类似资料:
  • 问题内容: 我开始使用AWS Lambda,并且尝试从处理程序功能请求外部服务。根据,HTTP请求应该可以正常工作,而且我还没有找到其他说明的文档。(实际上,人们已经发布了使用TwilioAPI发送SMS的代码。) 我的处理程序代码是: 我在CloudWatch日志中看到以下4行: 我希望在那里有另一行: 但这是缺失的。如果我使用的是本机上节点中没有处理程序包装的基本部分,则代码将按预期工作。 在

  • 问题内容: 在以下情况中,使用以下命令在第一次调用中成功,但是在第二次调用中失败: 为什么会这样,并且有一种方法可以在方法上设置属性,使其仅存在于一个实例上,而不是针对类的每个实例? Python 3.2.2 问题答案: 简短的答案:无法将自定义属性添加到绑定方法。 长答案如下。 在Python中,有 函数对象 和 方法对象 。当定义一个类时,该语句创建一个 函数对象 ,该 对象 位于该类的名称空

  • 我安装了SpaceVim来测试它和< kbd >;(分号)不起作用。< code >:nmap;表示“未找到映射”。问题是我在源代码中找不到它的未映射位置。在vim中有不同的方法来重新映射/取消映射一个键吗?我应该如何找到这些方法?

  • 但是,groups.remove(match2)方法不会从组中移除整数集。 这里发生了什么?

  • 我想将两个1d纹理传递到片段着色器中。我正在创建两个sampler1d纹理,将它们绑定到我的着色器程序,但似乎两个采样器使用相同的纹理。当我对texture1使用采样texelFetch时,它使用了我在texture2中定义的错误颜色。 当我希望看到红色屏幕时,下面的着色器程序会返回绿色屏幕。播放参数我看到,纹理1的buf中的任何变化都会改变纹理2的颜色。有什么办法解决吗? 这是我将着色器采样器绑

  • 将W,S和I,k绑定到乒乓球的左右桨。根据Eclipse,代码进入类p1_upaction扩展AbstractAction,但不运行公共void actionPerform(ActionEvent e)。我不知道该怎么办。键输入称为操作未注册。