Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加两个计算不正确的uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu_Python_Python 3.6 - Fatal编程技术网

Python 添加两个计算不正确的uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

Python 添加两个计算不正确的uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,python,python-3.6,Python,Python 3.6,我正在做一个简单的基于文本的游戏。 我的完整代码是150行,所以我将包括我认为相关的内容。如果你需要更多,请告诉我 问题是这一行: print("You deal " + str(hero.damage) + " damage to the monster") 只返回5而不是所需的5+级别 class Hero: def __init__(self): self.level = 0 self.damage = 5 + self.level #This

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

问题是这一行:

print("You deal " + str(hero.damage) + " damage to the monster")
只返回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\u up()
之所以成功,是因为:

print(hero.level)
返回根据需要正确更新的级别

我猜:

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

或:

\uuuu init\uuuu
中调用
\uuuuu init\uuuu
值时存在某种问题

或:


计算是在类Hero上完成的,而不是对象
Hero()

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

您有两个选择:

  • 要么你改变你的代码,在你改变等级的时候总是更新伤害。为了避免将损伤计算逻辑扩展到多个位置,您需要创建一个辅助方法来更新损伤值:

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

  • 你对自我伤害计算一次的猜测是正确的。正如@Willem Van Onsem提到的,
    self.damage=5+self.level
    是一个任务,而不是一个等式。每次更改
    self.level
    时,您都需要手动更新它

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

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

    处理相等的方式与python中的属性经常模拟的方式更密切相关。

    请注意,
    self.damage=5+self.level
    是一个赋值。不是一个等式。执行后,它不再更新。你得自己做,谢谢你。问题解决了。只需将粘贴:self.damage=5+self.level复制到level_up()。如果您想添加您的评论作为答案,我会将其标记为已回答。该死我就快到了。实际上,我在bottum XD的原始问题中提到了答案。只是没有把我的注意力放在那里,因为我不确定这是哪一个问题,我想这可能也是另一个问题。我不知道
    @property
    。这在某些情况下似乎非常有用。@事实上,属性用一个更自然的接口来访问或存储值,从而将getter和setter(是的,setter也是!)替换为非常有用的(pythonic)。关于这个话题的更多信息,请参阅,你的帖子教会了我两件事。谢谢:)。1:变量只存储一次,这是最终结果。2:@财产是一种东西。
    @property
    def damage(self):
        return 5 + self.level