如何更新依赖于另一个 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?