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.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
所以我知道它能够从 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。
所以,为了打发时间,我正在开发命令行 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.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
所以我知道它能够从 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。