如何更新依赖于另一个 class 变量的 class 变量
How to update a class variable that depends on another class variable
我是一名正在学习 Python 的学生,想知道如何解决标题中的问题。对于一个项目,我正在创建一个使用 class 来存储不同角色的某些变量的游戏。以下是 class:
的一部分
class character(object):
def __init__(self, vitality):
self.vitality = vitality
self.stats = f'Vitality: {self.vitality}'
我没有包括完整的 class 因为我有 41 个变量,其中一些是基于其他变量的组合,但这是它的要点。
稍后在代码中,我让用户选择一个变量以增加 1 以升级:
levelUpChoice = ''
levelUpChoiceList = ['1', '2', '3', '4', '5', '6', '7']
while levelUpChoice == '':
levelUpChoice = input('What stat would you like to increase?\n1) Vitality\n2) Endurance\n3) Strength\n4) Dexterity\n5) Wisdom\n6) Faith\n7) Luck\n\n > ')
if levelUpChoice not in levelUpChoiceList:
levelUpChoice = ''
print('That is not an accepted response!\nUse a number 1-7.')
if int(levelUpChoice) == 1:
charClass.vitality += 1
但是,当我将“vitality”递增 1 时,名为“stats”的 class 变量不会更新,即使它是基于它的。正如我在 2 天前真正了解到 classes 以及如何通常使用它们一样,我不太确定如何处理这个问题,但我需要一个解决方案来使项目具有完整的功能。鉴于我最重要的 class 变量取决于我计划更改的基本变量,我真的需要一个解决方案。
如有任何提示或建议,我们将不胜感激。
将stats
设为属性。这将导致您每次访问它时都重新计算它。 属性 本质上是围绕方法的语法糖,使其像任何其他类型的属性一样工作——即您可以将 self.stats
视为常规字符串,即使它实际上是一个函数调用。
class Character:
def __init__(self, vitality: int):
self.vitality = vitality
@property
def stats(self) -> str:
return f'Vitality: {self.vitality}'
(请注意,没有必要显式继承 object
,标准 Python 样式是将 class 名称大写。)
一些解决方法:
将 vitality
更新为 setter 并更改 stats
:
class character(object):
def __init__(self, vitality):
self.vitality = vitality
self.stats = f'Vitality: {self.vitality}'
def set_vitality(self, val):
self.vitality = val
self.stats = f'Vitality: {val}'
或者更高级的概念使用@property
class character(object):
def __init__(self, vitality):
self.vitality = vitality
@property
def stats(self):
return f'Vitality: {self.vitality}'
如果您只需要更新 stats
属性,最简单的选择可能是将其设为 property
。
class character(object):
def __init__(self, vitality):
self.vitality = vitality
#Accessed when character.stats is called
#and constructs string at call time
@property
def stats(self):
return f'Vitality: {self.vitality}'
这里对属性有相当详细的讨论:How does the @property decorator work in Python?
我是一名正在学习 Python 的学生,想知道如何解决标题中的问题。对于一个项目,我正在创建一个使用 class 来存储不同角色的某些变量的游戏。以下是 class:
的一部分class character(object):
def __init__(self, vitality):
self.vitality = vitality
self.stats = f'Vitality: {self.vitality}'
我没有包括完整的 class 因为我有 41 个变量,其中一些是基于其他变量的组合,但这是它的要点。
稍后在代码中,我让用户选择一个变量以增加 1 以升级:
levelUpChoice = ''
levelUpChoiceList = ['1', '2', '3', '4', '5', '6', '7']
while levelUpChoice == '':
levelUpChoice = input('What stat would you like to increase?\n1) Vitality\n2) Endurance\n3) Strength\n4) Dexterity\n5) Wisdom\n6) Faith\n7) Luck\n\n > ')
if levelUpChoice not in levelUpChoiceList:
levelUpChoice = ''
print('That is not an accepted response!\nUse a number 1-7.')
if int(levelUpChoice) == 1:
charClass.vitality += 1
但是,当我将“vitality”递增 1 时,名为“stats”的 class 变量不会更新,即使它是基于它的。正如我在 2 天前真正了解到 classes 以及如何通常使用它们一样,我不太确定如何处理这个问题,但我需要一个解决方案来使项目具有完整的功能。鉴于我最重要的 class 变量取决于我计划更改的基本变量,我真的需要一个解决方案。
如有任何提示或建议,我们将不胜感激。
将stats
设为属性。这将导致您每次访问它时都重新计算它。 属性 本质上是围绕方法的语法糖,使其像任何其他类型的属性一样工作——即您可以将 self.stats
视为常规字符串,即使它实际上是一个函数调用。
class Character:
def __init__(self, vitality: int):
self.vitality = vitality
@property
def stats(self) -> str:
return f'Vitality: {self.vitality}'
(请注意,没有必要显式继承 object
,标准 Python 样式是将 class 名称大写。)
一些解决方法:
将 vitality
更新为 setter 并更改 stats
:
class character(object):
def __init__(self, vitality):
self.vitality = vitality
self.stats = f'Vitality: {self.vitality}'
def set_vitality(self, val):
self.vitality = val
self.stats = f'Vitality: {val}'
或者更高级的概念使用@property
class character(object):
def __init__(self, vitality):
self.vitality = vitality
@property
def stats(self):
return f'Vitality: {self.vitality}'
如果您只需要更新 stats
属性,最简单的选择可能是将其设为 property
。
class character(object):
def __init__(self, vitality):
self.vitality = vitality
#Accessed when character.stats is called
#and constructs string at call time
@property
def stats(self):
return f'Vitality: {self.vitality}'
这里对属性有相当详细的讨论:How does the @property decorator work in Python?