下面我有一个简单的类,其中包含一些事件。不用担心Event
课程,它完美无缺。
class Warrior:
def __init__(self, health, damage):
self.health = health
self.damage = damage
# events
self.e_hurt = Event()
self.e_attack = Event()
def hurt(self, damage):
self.health -= damage
self.e_hurt.fire()
def attack(self, target):
target.hurt(self.damage)
self.e_attack.fire()
我不知道在哪里触发我的事件。e_hurt
在战士受伤后触发事件以及在战士攻击后触发事件是最有意义e_attack
的。但是,这会导致在攻击victim.e_hurt
之前被解雇:attacker.e_attack
attacker
victim
def on_hurt():
print "Someone was hurt."
def on_attack():
print "Someone attacked."
def main():
victim = Warrior(50, 0)
victim.e_hurt.subscribe(on_hurt)
attacker = Warrior(50, 20)
attacker.e_attack.subscribe(on_attack)
attacker.attack(victim)
这两个事件以“错误”(程序上正确,但语义上错误)的顺序输出:
Someone was hurt.
Someone attacked.
显然,战士必须在其他战士受伤之前发动攻击。当然,我可以将attack
-method 更改为如下所示:
def attack(self, target):
self.e_attack.fire()
target.hurt(self.damage)
但是在实际攻击发生之前引发攻击事件并不合适,并且可能需要在攻击之后调用其他一些事件。
我能想到的唯一实际解决方案是有两个事件(before_attack
和after_attack
),但是有没有更好的解决方案,一个实际事件(攻击)不需要两个事件?