class 实例中的变量在分配时不会采用新值。

Variable within an instance of a class does not take a new value when it is assigned.

所以,为了打发时间,我正在开发命令行 RPG,并重新拉伸我的 Python 肌肉,因为我已经好几年没有练习了。我曾经以真正实用的方式编写代码,但我正在努力了解面向对象的编程。

除了前言,我有一个问题,在创建 class 的实例后,我的 class 变量不再被定义。我已经制作了 2 个版本,我将用它们来演示,因为我发现它很难表达。

下面我创建了一个 "character" class,我打算将其用作玩家角色和 npc 的基础。在初稿中,我更新了这个 class,然后才意识到它会影响 subclasses,而我真的只是想把它作为一个模板。无论哪种方式,这个特定的代码块都有效;它将 2 个字典的值加在一起,然后将它们分配给 character.characterStats。然后根据 displayStats().

打印它们
from collections import Counter

class character:
    def __init__(self, *args, **kwargs):
        pass

    def __setattr__(self, name, value):
        pass

    characterRace = ''
    characterStats = {}
    charLocation = ''
    charName = ''

class race:
    def __init__(self):
        pass

    baseStatsDict = {
        'Strength' : 5,
        'Agility' : 5,
        'Toughness' : 5,
        'Intelligence' : 5 }

    humanStatsDict = {
        'Strength' : 1,
        'Agility' : 1,
        'Toughness' : 1,
        'Intelligence' : 1 }


def displayRace():
    print("Race: ", character.characterRace, "\n")

def displayStats():
    for stat, value in character.characterStats.items():
        print(stat, "=", value)
    print("\n")

def raceSelection():
    playerInput = input("I am a ")
    playerInput
    playerLower = playerInput.lower()

    while "human" not in playerLower:
        if "human" in playerLower:
            character.characterStats = dict(Counter(race.baseStatsDict)+Counter(race.humanStatsDict))
            character.characterRace = 'Human'
            break

        playerInput = input()
        playerInput
        playerLower = playerInput.lower()


playerChar = character()
raceSelection()
displayRace()
displayStats()

这是输出:

Race:  Human 

Strength = 6
Agility = 6
Toughness = 6
Intelligence = 6

然而,这是新代码,当我试图整理它并将 class 变成它应该成为的模板,并开始使用 class 实例 playerChar无论出于何种原因,它都无法将新值分配给 playerChar.characterStatsplayerChar.displayStats()characterRacecharacterStats 变量打印为空,即使它们是在玩家输入值 human.

时分配的
from collections import Counter

class character:
    characterRace = ''
    characterStats = {}

    def __init__(self):
        pass

    def displayRace(self):
        print("Race: ", self.characterRace, "\n")

    def displayStats(self):
        for stat, value in self.characterStats.items():
            print(stat, "=", value)
        print("\n")

class race:
    def __init__(self):
        pass

    baseStatsDict = {
        'Strength' : 5,
        'Agility' : 5,
        'Toughness' : 5,
        'Intelligence' : 5 }

    humanStatsDict = {
        'Strength' : 1,
        'Agility' : 1,
        'Toughness' : 1,
        'Intelligence' : 1 }

def raceSelection():
    playerInput = input("I am a ")
    playerInput
    playerLower = playerInput.lower()

    while "human" not in playerLower:
        if "human" in playerLower:
            playerChar.characterStats = dict(Counter(race.baseStatsDict)+Counter(race.humanStatsDict))
            playerChar.characterRace = 'Human'
            break

        playerInput = input()
        playerInput
        playerLower = playerInput.lower()

playerChar = character()
raceSelection()
playerChar.displayRace()
playerChar.displayStats()

所以这将输出:

Race:
\n
\n
\n

所以我知道它能够从 class race 词典中提取并将它们的内容添加到一起,就像之前的代码一样。如果我尝试打印 player.x 特征,它不会抛出任何错误,因此它会识别它们的存在。如果有人能向我解释在这个新的迭代中出了什么问题以及为什么,我将不胜感激。

编辑:所以我和一个朋友尝试将 class 作为 raceSelection() 的参数传递,我们尝试在变量的每个 call/update 之后打印一个字符串,然后我们我试过在变量中输入一个字符串,打印它,然后用一个新字符串重新定义变量。

输入:

class character:
    charRace = ''
    charStats = {}
    charLocation = ''
    charName = ''
    charString = "Cole said define a string."

if 语句中:

if "human" in playerLower:
    print("Oh, you're just a really ugly human.")
    playerChar.charStats = dict(Counter(race.baseStatsDict)+Counter(race.humanStatsDict))
    playerChar.charRace = 'Ugly Human'
    print("playerChar.charString = ", playerChar.charString)
    playerChar.charString = "Redefine."
    print("playerChar.charString = ", playerChar.charString)
    break

输出:

Oh, you're just a really ugly human.
playerChar.charString =  Cole said define a string.
playerChar.charString =  Cole said define a string.
Race: 

不应该character.characterStats.items(),而是self.characterStats.items()。对于属于 一个特定 字符的所有其他值也是如此。

使用 class 的名称分配属于 class 的值,并且对于您创建的所有对象都是相同的。查找 实例与 class 属性 .

因此,在尝试将变量移入和移出 __init__、尝试 setattr() 之后,尝试通过 class 传递任何类型的参数,以便它有一些数据,尝试通过一个函数 运行 class 的实例,none 这些解决方案最终起作用了。

解决方案原来是创建 character 的子class 并对其进行操作。我认为这也没什么问题,因为玩家角色会在整个游戏过程中发生变异,并且永远不会再看到自己的子class。