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_attackされます。attackervictim

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)

2 つのイベントは、「間違った」(プログラム的には正しいが、意味的には間違っている) 順序で出力されます。

 Someone was hurt.
 Someone attacked.

明らかに、他の戦士が怪我をする前に、戦士が攻撃する必要があります。もちろん、attack-method を次のように変更することもできます。

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

しかし、実際の攻撃が発生する前に攻撃イベントを発生させるのは適切ではなく、攻撃後に他のイベントを呼び出す必要がある場合もあります。

私が考えることができる唯一の実際の解決策は、2 つのイベント (before_attackおよびafter_attack) を持つことですが、1 つの実際のイベント (攻撃) に対して 2 つのイベントを必要としないより良い解決策はありますか?

4

1 に答える 1