添加两个 __init__ 变量计算不正确(应该很简单解决,我是 类 的菜鸟)

Adding two __init__ variables not calculating correctly (should be simple solve, I'm noob to classes)

我正在制作一个简单的基于文本的游戏。 我的完整代码是 150 行,因此我将包括我认为相关的内容。如果您需要更多,请告诉我。

问题是这一行:

print("You deal " + str(hero.damage) + " damage to the monster")

returns 只需要 5 级而不是 5+ 级。

class Hero:

    def __init__(self):
        self.level = 0
        self.damage = 5 + self.level #This is the problem line. Self.level seems to be treated as equal to 0 even when it is higher than 0.
        self.experience = 0
    def level_up(self): #triggered on monster death
        xp_required = 15
        if self.experience >= xp_required:
            self.level += 1
hero = Hero()

我知道 hero.level_up() 是成功的,因为:

print(hero.level)

returns 适当更新的关卡。

我猜是:

self.damage 只计算一次,然后存储该值,即使它的组件已更改。

或:

__init__ 中调用 __init__ 值时出现某种问题。

或:

计算是针对 class 英雄,而不是对象 Hero()

你是对的,self.damage 只被写入一次:在 __init__ 构造函数中,它本身只被调用一次(当对象被创建时)。那时,self.level 为零,因此 self.damage 将始终为 5。

您有两个选择:

  1. 要么更改代码以在更改级别时始终更新损坏。为了避免将伤害计算逻辑分散到多个地方,您将创建一个辅助方法来更新伤害值:

    def update_damage(self):
        self.damage = 5 + self.level
    
    def level_up(self):
        if self.experience <= 15:
            self.level += 1
            self.update_damage()
    

    如果伤害值只依赖于等级,你也可以将其设为update_level(new_level)方法;但我在这里选择不使用该解决方案,因为其他一些东西也会影响以后的伤害(例如伤害药水或其他)并不少见。

  2. 或者你把damage改成计算出来的属性,这样每次访问都会计算伤害值。这有每次都需要计算的开销,而不是将值存储在某个地方,但另一方面,你有关于伤害值的最终真相,你不需要记住在别处更新它:

    def __init__(self):
        self.level = 0
        self.experience = 0 
    
    @property
    def damage(self):
        return 5 + self.level
    

您对 self.damage 被计算一次的猜测是正确的。正如@Willem Van Onsem 所提到的, self.damage= 5+self.level 是一个赋值而不是一个等式。每次更改 self.level.

时都需要手动更新它

对我来说最合适的方法似乎是将其包装成 属性 例如:

@property
def damage(self):
    return 5 + self.level

您对待平等的方式与 reactive programming 更密切相关,reactive programming 通常用 python 中的属性来模拟。