【问题标题】:Better logic for firing events and doing the actual event?触发事件和执行实际事件的更好逻辑?
【发布时间】:2013-05-26 14:20:51
【问题描述】:

下面我有一个简单的类,其中包含一些事件。 不用担心 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_hurtattacker.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_attackafter_attack),但有没有更好的解决方案,一个实际事件(攻击)不需要两个事件?

【问题讨论】:

    标签: python events logic


    【解决方案1】:
    def attack(self, target):
        self.e_attack.fire()
        target.hurt(self.damage)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 2018-12-30
      • 1970-01-01
      • 2021-10-01
      • 2017-04-25
      • 2020-02-18
      • 2019-09-29
      相关资源
      最近更新 更多