分配给类的实例中的变量后,它不会采用新值。

时间:2018-08-29 15:51:29

标签: python class variables undefined

因此,为了节省时间,我正在开发一个命令行RPG,并且由于我已经不使用几年了,所以重新伸展了我的Python肌肉。我曾经以一种真正的功能性方式进行编码,但我试图绕过面向对象的编程。

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

下面,我创建了一个“字符”类,打算将其用作玩家角色和NPC的基础。在初稿中,我实际上是希望将其作为模板,然后才更新该类,然后才意识到它将影响子类。无论哪种方式,这个特定的代码块都有效。它将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

这是新代码,当我尝试整理一下并将类转换为它应有的模板时,并开始使用类实例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特性,它不会抛出任何错误,因此可以识别出它们的存在。如果有人可以向我解释发生了什么问题以及为什么在新的迭代中,我将非常感谢。

编辑:因此,我和一个朋友尝试将类作为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: 

2 个答案:

答案 0 :(得分:0)

不应character.characterStats.items(),而应为self.characterStats.items()。同样,对于属于一个特定字符的所有其他值。

使用类的名称会分配一个属于该类的值,并且对于您创建的所有对象都是相同的。查找实例vs类属性

答案 1 :(得分:0)

因此,在尝试将变量移入和移出__init__之后,尝试setattr(),尝试通过类传递任何类型的参数,以使其具有一些数据,并尝试运行实例通过一个函数的类,最后没有一个解决方案。

原来的解决方案是创建character的子类并对其进行操作。我认为这也是可以的,因为玩家角色会在整个游戏过程中发生变异,并且永远不会看到其自身的其他子类。