类实例内的变量在被分配时不会取新值

2024-04-23 15:59:30 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我正在开发一个命令行RPG来填充时间,并重新拉伸我的Python肌肉,因为我已经停止了几年的练习。我以前是用一种非常实用的方式编写代码的,但我现在正努力学习面向对象编程。你知道吗

撇开序言不谈,我有一个问题,在创建类的实例之后,我的类变量不再被定义。我已经做了两个版本,我将用它来演示,因为我发现它很难表达。你知道吗

下面我创建了一个“character”类,作为玩家角色和npc的基础。在第一稿中,我更新了这个类,在意识到它会影响子类之前,当时我真的只想把它作为模板。无论哪种方式,这个特定的代码块都有效;它将两个字典的值相加,然后将它们赋给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: 

Tags: inselfdefcounterprinthumancharacterrace
2条回答

因此,在尝试将变量移入和移出__init__,尝试setattr(),尝试通过类传递任何类型的参数,以便它有一些数据,尝试通过函数运行类的实例之后,这些解决方案最终都无法奏效。你知道吗

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

它不应该是character.characterStats.items(),而应该是self.characterStats.items()。类似地,对于属于一个特定字符的所有其他值。你知道吗

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

相关问题 更多 >