1

次のようなクラスPersonがあります。

class Person(object):
    def __init__(self, health, damage):
        self.health = health
        self.damage = damage

    def attack(self, victim):
        victim.hurt(self.damage)

    def hurt(self, damage):
        self.health -= damage

Eventイベントが発生したときに呼び出されるリスナー関数を保持するクラスもあります。インスタンスにいくつかのイベントを追加しましょう。

    def __init__(self, health, damage):
        self.health = health
        self.damage = damage
        self.event_attack = Event() # fire when person attacks
        self.event_hurt = Event() # fire when person takes damage
        self.event_kill = Event() # fire when person kills someone
        self.event_death = Event() # fire when person dies

さて、私はイベントがリスナー関数に特定のデータを送信するようにしたいと思います**kwargs. 問題は、4 つのイベントすべてで と の両方を送信することattackerですvictimattackerこれにより、やや複雑になります。パラメータとして-methodに渡してから、 inの-methodのhurt()イベントを再度発生させる必要があります。attackervictimhurt()

def attack(self, victim):
    self.event_attack.fire(victim=victim, attacker=self)
    victim.hurt(self, self.damage)

def hurt(self, attacker, damage):
    self.health -= damage
    self.event_hurt.fire(attacker=attacker, victim=self)
    if self.health <= 0:
        attacker.event_kill.fire(attacker=attacker, victim=self)
        self.event_death.fire(attacker=attacker, victim=self)

イベントを発生させるためだけに、傷つけるためには必要ないので、 -methodattackerのパラメーターとして与えるべきではないと思います。hurt()また、event_kill被害者のメソッド内で攻撃者のイベントを発生させることhurt()は、カプセル化にほとんど反しません。

これらのイベントがカプセル化に従い、一般的により意味のあるものになるように、これらのイベントをどのように設計すればよいですか?

4

1 に答える 1