Python 类实例中的变量在赋值时不接受新值。

Python 类实例中的变量在赋值时不接受新值。,python,class,variables,undefined,Python,Class,Variables,Undefined,因此,为了节省时间,我正在开发一个命令行RPG,并重新拉伸了我的Python肌肉,因为我已经停止了几年的练习。我过去常常以一种真正实用的方式编写代码,但现在我正试图了解面向对象编程 撇开前言不谈,我有一个问题,在创建一个类的实例之后,我的类变量不再被定义。我已经制作了两个版本,我将用它们来演示,因为我发现很难清晰地表达出来 下面我创建了一个“角色”类,我打算将其用作玩家角色和NPC的基础。在第一稿中,我更新了这个类,在意识到它会影响子类之前,我真的只是想把它作为一个模板。无论哪种方式,这个特定的

因此,为了节省时间,我正在开发一个命令行RPG,并重新拉伸了我的Python肌肉,因为我已经停止了几年的练习。我过去常常以一种真正实用的方式编写代码,但现在我正试图了解面向对象编程

撇开前言不谈,我有一个问题,在创建一个类的实例之后,我的类变量不再被定义。我已经制作了两个版本,我将用它们来演示,因为我发现很难清晰地表达出来

下面我创建了一个“角色”类,我打算将其用作玩家角色和NPC的基础。在第一稿中,我更新了这个类,在意识到它会影响子类之前,我真的只是想把它作为一个模板。无论哪种方式,这个特定的代码块都有效;它将两个字典的值相加,然后将它们分配给
character.characterStats
。然后按照
displayStats()
打印它们

这就是结果:

Race:  Human 

Strength = 6
Agility = 6
Toughness = 6
Intelligence = 6
然而,当我试图整理它并将类转换为它想要的模板,并开始使用类实例
playerChar
时,这就是新代码,无论出于何种原因,它都无法将新值分配给
playerChar.characterStats
playerChar.displayStats()
characterRace
characterStats
变量打印为空,即使它们是在玩家输入值
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
因此,我知道它能够从
类竞赛
字典中提取,并将它们的内容添加到一起,就像前面的代码一样。如果我尝试打印
player.x
特征,它不会抛出任何错误,因此它会识别它们的存在。如果有人能在这个新的迭代中向我解释出哪里出了问题以及原因,我将非常感激

编辑:所以我和一位朋友尝试将该类作为
raceSelection()
的参数传递,我们尝试在每次调用/更新变量后打印一个字符串,我们尝试在变量中输入一个字符串,打印它,然后用新字符串重新定义变量

输入:

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()
。同样,对于属于一个特定字符的所有其他值


使用类的名称指定一个属于该类的值,该值对于您创建的所有对象都是相同的。查找实例与类属性。

因此,在尝试将变量移入和移出
\uuuu init\uuuu
之后,尝试
setattr()
,尝试通过类传递任何类型的参数以使其具有一些数据,尝试通过函数运行类的实例,这些解决方案最终都不起作用


解决方案是创建
character
的子类,并对其进行操作。我想这也没关系,因为玩家角色在整个游戏过程中都会发生变异,永远不会看到自己的进一步子类。

我不认为当“人类”或“精灵”或“兽人”不在playerLower中时:如果“人类”(这是真的)或“精灵”(这是真的)或“兽人”不在playerLower中,这就是你想要的行为(这是您要检查的唯一一个)哦,对不起,为了说明的目的,我去掉了剩余的内容,我为所有3个选项都提供了代码块。您会注意到,在第二组代码中,我使用了
self.characterStats.items()
,这就是为什么我对变量没有取值感到困惑的原因。
Oh, you're just a really ugly human.
playerChar.charString =  Cole said define a string.
playerChar.charString =  Cole said define a string.
Race: