【发布时间】:2018-03-12 04:02:42
【问题描述】:
我使用以下类来定义事件:
class Event(object):
def __init__(self):
self.handlers = set()
def handle(self, handler):
self.handlers.add(handler)
return self
def unhandle(self, handler):
try:
self.handlers.remove(handler)
except:
raise ValueError("Handler is not handling this event, so cannot unhandle it.")
return self
def fire(self, *args, **kwargs):
for handler in self.handlers:
print(handler)
handler(*args, **kwargs)
def getHandlerCount(self):
return len(self.handlers)
__iadd__ = handle
__isub__ = unhandle
__call__ = fire
__len__ = getHandlerCount
我有一些这样定义的模型类:
class SomeModel(object):
def __init__(self):
self._foo = 0
self.fooChanged = Event()
@property
def foo(self):
return self._foo
@foo.setter
def foo(self, value):
self._foo = value
self.fooChanged(value)
现在,假设我想像这样更改foo:
model = SomeModel()
other_model = SomeModel()
model.fooChanged += other_model.foo
model.foo = 1
model.foo = 1 之后,出现以下错误:
TypeError: 'int' 对象不可调用
现在,假设我使用这段代码来定义模型:
class SomeModel(object):
def __init__(self):
self._foo = 0
self.fooChanged = Event()
def get_foo(self):
return self._foo
def set_foo(self, value):
self._foo = value
self.fooChanged(value)
foo = property(get_foo, set_foo)
这个代码改变foo的值:
model = SomeModel()
other_model = SomeModel()
model.fooChanged += other_model.set_foo
model.foo = 1
第二个版本运行良好,但是对我来说似乎有点不符合 Python 风格。我必须定义get_foo 方法,我想避免(因为属性可用)。这里是否有其他解决方法,所以可以运行第一个版本的代码?
注意:错误取决于self._foo 类型。如果是None,会返回错误提示NoneType不可调用,如果是字符串,错误会提示str对象不可调用。
【问题讨论】:
标签: python event-handling