我今天写了这样的东西(与 mpl_connect 文档不同:
class Foo(object):
def __init__(self): print 'init Foo', self
def __del__(self): print 'del Foo', self
def callback(self, event=None): print 'Foo.callback', self, event
from pylab import *
fig = figure()
plot(randn(10))
cid = fig.canvas.mpl_connect('button_press_event', Foo().callback)
show()
这看起来很合理,但它不起作用——就好像 matplotlib 忘记了我给它的函数。如果Foo().callback
我不通过它,而是通过它lambda e: Foo().callback(e)
,它可以工作。同样,如果我说x = Foo()
然后通过它x.callback
,它会起作用。
我的假设是,创建的未命名 Foo 实例Foo()
在该行之后立即被销毁mpl_connect
——具有Foo.callback
引用的 matplotlib 不会保持Foo
活动状态。那是对的吗?
在我遇到的非玩具代码中,解决方案x = Foo()
不起作用,大概是因为在那种情况下show()
在其他地方所以x
超出了范围。
更一般地说,Foo().callback
是一个<bound method Foo.callback of <__main__.Foo object at 0x03B37890>>
。我的主要惊讶是,绑定方法似乎实际上并没有保留对对象的引用。那是对的吗?