【发布时间】:2015-09-04 03:55:51
【问题描述】:
我正在创建一个事件系统,它使用以下事件类:
class Event(set):
def __init__(self, name, iterable=()):
super().__init__(iterable)
self.name = name
def __iadd__(self, listener):
self.add(listener)
return self
def __isub__(self, listener):
self.remove(listener)
return self
def fire(self, **eargs):
for listener in self:
listener(**eargs)
现在我正在尝试创建某种字典,它会自动在其__init__ 中创建事件,如下所示:
class EventDict(dict):
def __init__(self, prefix, *event_names):
super().__init__({
name: Event('%s.%s' % (prefix, name))
for name in event_names
})
下面是一个用法示例:
class Player:
def __init__(self, name):
self._name = name
self.events = EventDict('Player', 'change_name')
@property
def name(self):
returns self._name
@name.setter
def name(self, value):
old_name = self.name
self.name = value
self.events['change_name'].fire(player=self, old_name=old_name)
现在我面临的问题是子类化。
如果我要继承我的Player 类以包含health 属性,我不能使用相同的方式来创建事件字典,因为它会覆盖现有的字典,我无法再访问change_name。
所以我正在尝试找到一种方法,让我可以做这样的事情(理想的解决方案):
class Player:
events = EventDict('Player', 'change_name')
class Player2(Player):
events = EventDict('Player2', 'attack', 'kill')
p2 = Player2()
p2.events['change_name'] += my_event_listener # Still access Player class's events
这样的事情可能吗?
我知道我能做到:
class Player2(Player):
def __init__(self, name):
super().__init__()
self.events.update(...)
但不一样:P
【问题讨论】:
标签: python python-3.x dictionary superclass