2013-05-26 44 views
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是最有意義的。 attacker.e_attack前 但是,這導致進入victim.e_hurt被炒,當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_attackafter_attack),但有沒有更好的解決方案,不需要兩個事件的一個實際事件(攻擊)?

回答

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

似乎對我來說完全有意義。 self先攻擊,然後target受傷。