Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自动检测发送者的事件系统?_Python_Events_Python 3.x_Event Handling - Fatal编程技术网

Python 自动检测发送者的事件系统?

Python 自动检测发送者的事件系统?,python,events,python-3.x,event-handling,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 de

以下是我当前的活动系统:

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()
,而不必手动将
发送方
传递给事件。
这在Python中可能吗?

我会更改事件类,以便它在实例化时接受并存储
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()

,但这会创建大量额外的
事件
实例!而不是只使用一个,然后将
发送方
作为参数传递给函数