用于触发事件和执行实际事件的更好逻辑?

时间:2013-05-26 14:20:52

标签: python events logic

下面我有一个简单的类,里面有一些事件。 不要担心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}})但是有一个更好的解决方案,一个实际事件(攻击)不需要两个事件吗?

1 个答案:

答案 0 :(得分:2)

def attack(self, target):
    self.e_attack.fire()
    target.hurt(self.damage)

对我来说似乎很有意义。 self首先发起攻击,然后target受到伤害。