我有一个指定一组回调函数的类(此处显示为 cb1
和 cb2
)。我保留了这些我想在某些事件后调用的 map 。
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
) 被复制到 map 中。因此,即使在用户“注册”回调(通过分配给 cb1
)之后,映射中的值仍然是 None
,并且不会调用任何内容。
由于 Python 中没有“通过引用”这样的东西,我该如何解决这个问题?
最佳答案
为什么不让您的类明确处理注册?
import collections
class Foo(object):
handlers = None
def __init__(self):
self.handlers = collections.defaultdict(set)
def register(self, event, callback):
self.handlers[event].add(callback)
def fire(self, event, **kwargs):
for handler in self.handlers.get(event, []):
handler(**kwargs)
foo = Foo()
foo.register('one', mycallback)
foo.fire('one')
关于Python 对字典中回调的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7747611/