我有一个类指定了一组回调函数(这里显示为cb1
和cb2
)。我保留了一些我想在某些事件后致电的地图。在字典中回调的Python引用
class Foo:
cb1 = None
cb2 = None
def test(self, input):
for (name, callback) in map:
if name == input:
if callback: callback()
...
map = {'one':cb1, 'two':cb2}
def mycallback():
print "mycallback()"
f = Foo()
f.cb1 = mycallback # Register our callback
f.test('one') # Nothing happens
你能发现问题吗?
会发生什么情况,是当类被初始化时,值cb1
和cb2
(这两者都是None
)被复制到地图。因此,即使用户“注册”了回拨(通过分配给cb1
),地图中的值仍然是None
,并且不会调用任何内容。
由于在Python中没有像'引用'那样的东西,我该如何解决这个问题?
鸡蛋里挑骨头:一切“引用”在Python通过。但它是通过引用,而不是* name *:如果您将该名称重新绑定到另一个对象,则不会更新其他引用以指向任何名称。 –