我有一个类,它指定了一组回调函数(此处显示为cb1和cb2).我保留了一些地图,我想在一些事件后打电话给我.
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
Run Code Online (Sandbox Code Playgroud)
你能发现问题吗?
会发生什么事是,当类初始化时,值的cb1和cb2(这两者都是None)被复制到地图.因此,即使用户'注册'回调(通过分配cb1),地图中的值仍然None没有被调用.
由于Python中没有"引用"这样的东西,我该如何解决这个问题呢?
pat*_*rys 12
为什么不让你的类明确处理注册?
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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2863 次 |
| 最近记录: |