2

下面我有一个简单的类,其中包含一些事件。不用担心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_attackattackervictim

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_attackafter_attack),但是有没有更好的解决方案,一个实际事件(攻击)不需要两个事件?

4

1 回答 1

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

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

于 2013-05-26T14:33:40.500 回答