自动检测发件人的事件系统?

时间:2015-07-13 12:30:09

标签: python events python-3.x event-handling

这是我目前的活动系统:

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中是否可行?

1 个答案:

答案 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()