这是我目前的活动系统:
class Event(set):
def fire(self, sender, **event_args):
for handler in self:
handler(sender, *event_args)
使用方法如下:
class Warrior:
e_death = Event()
def __init__(self, name):
self.name = name
def death_printer(sender, **event_args):
print(sender.name, 'has died!')
Warrior.e_death.add(death_printer)
warrior = Warrior('My Warrior')
warrior.e_death.fire(warrior)
我想要解决的“问题”在最后一行:warrior.e_death.fire(warrior)
。我不想重复该对象的名称,因此我可以warrior.e_death.fire()
而不必手动将sender
传递给该事件。
这在Python中是否可行?
答案 0 :(得分:0)
我会更改Event类,以便在实例化时接受并存储sender
的值:
class Event(set):
def __init__(self, sender, *args, **kwargs):
super(Event, self).__init__(*args, **kwargs)
self.sender = sender
def fire(self, **event_args):
for handler in self:
handler(self.sender, *event_args)
现在在Warrior的init中实例化,而不是在类级别:
class Warrior()
def __init__(self, *args, **kwargs):
super(Warrior, self).__init__(*args, **kwargs)
self.e_death = Event(self)
现在你可以warrior.e_death.fire()
。