下面我有一个简单的类,里面有一些事件。
不要担心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
显然战士必须在其他战士受伤之前进行攻击。
当然,我可以将def attack(self, target):
self.e_attack.fire()
target.hurt(self.damage)
- 方法更改为:
before_attack
但是在实际攻击发生之前提出攻击事件并不合适,并且在攻击发生后可能需要调用其他一些事件。
我能想到的唯一实际解决方案是有两个事件(after_attack
和{{1}})但是有一个更好的解决方案,一个实际事件(攻击)不需要两个事件吗?
答案 0 :(得分:2)
def attack(self, target):
self.e_attack.fire()
target.hurt(self.damage)
对我来说似乎很有意义。 self
首先发起攻击,然后target
受到伤害。