因此,为了节省时间,我正在开发一个命令行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.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
特性,它不会抛出任何错误,因此可以识别出它们的存在。如果有人可以向我解释发生了什么问题以及为什么在新的迭代中,我将非常感谢。
编辑:因此,我和一个朋友尝试将类作为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:
答案 0 :(得分:0)
不应为character.characterStats.items()
,而应为self.characterStats.items()
。同样,对于属于一个特定字符的所有其他值。
使用类的名称会分配一个属于该类的值,并且对于您创建的所有对象都是相同的。查找实例vs类属性。
答案 1 :(得分:0)
因此,在尝试将变量移入和移出__init__
之后,尝试setattr()
,尝试通过类传递任何类型的参数,以使其具有一些数据,并尝试运行实例通过一个函数的类,最后没有一个解决方案。
原来的解决方案是创建character
的子类并对其进行操作。我认为这也是可以的,因为玩家角色会在整个游戏过程中发生变异,并且永远不会看到其自身的其他子类。