添加两个 __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。
您有两个选择:
要么更改代码以在更改级别时始终更新损坏。为了避免将伤害计算逻辑分散到多个地方,您将创建一个辅助方法来更新伤害值:
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)
方法;但我在这里选择不使用该解决方案,因为其他一些东西也会影响以后的伤害(例如伤害药水或其他)并不少见。
或者你把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 中的属性来模拟。
我正在制作一个简单的基于文本的游戏。 我的完整代码是 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。
您有两个选择:
要么更改代码以在更改级别时始终更新损坏。为了避免将伤害计算逻辑分散到多个地方,您将创建一个辅助方法来更新伤害值:
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)
方法;但我在这里选择不使用该解决方案,因为其他一些东西也会影响以后的伤害(例如伤害药水或其他)并不少见。或者你把
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 中的属性来模拟。