Python 添加两个计算不正确的uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
我正在做一个简单的基于文本的游戏。 我的完整代码是150行,所以我将包括我认为相关的内容。如果你需要更多,请告诉我 问题是这一行: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
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