因此,我正在开发一个命令行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.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:
因此,在尝试将变量移入和移出
__init__
,尝试setattr()
,尝试通过类传递任何类型的参数,以便它有一些数据,尝试通过函数运行类的实例之后,这些解决方案最终都无法奏效。你知道吗解决方案是创建
character
的子类并对其进行操作。我想这也没关系,因为玩家角色在整个游戏过程中会发生变异,而且永远不会看到自己的子类。你知道吗它不应该是
character.characterStats.items()
,而应该是self.characterStats.items()
。类似地,对于属于一个特定字符的所有其他值。你知道吗使用类的名称指定一个属于该类的值,该值对于您创建的所有对象都是相同的。查找实例vs类属性。你知道吗
相关问题 更多 >
编程相关推荐