Python 将属性从一个类传递给另一个调用
我试图将值从Python 将属性从一个类传递给另一个调用,python,adventure,Python,Adventure,我试图将值从getattr传递到另一个class Map(),但它仍然告诉我类引擎中没有此参数。问题是如何将属性传递给类映射?它将继续在类引擎()中查找属性 类引擎(对象): 回溯 回溯(最近一次呼叫最后一次): 文件“c:\Learn\u Python\u In\u the \u hard\u way\SourceCode\E42\u Class\u Execrise.py”,第175行,在a\u game.play()中 文件“c:\Learn\u Python\u In\u the \u
getattr
传递到另一个class Map()
,但它仍然告诉我类引擎中没有此参数。问题是如何将属性传递给类映射?它将继续在类引擎()中查找属性
类引擎(对象):
回溯
回溯(最近一次呼叫最后一次):
文件“c:\Learn\u Python\u In\u the \u hard\u way\SourceCode\E42\u Class\u Execrise.py”,第175行,在a\u game.play()中
文件“c:\Learn\u Python\u In\u the \u hard\u way\SourceCode\E42\u Class\u Execrise.py”,第27行,In play Map=getattr(self,next)
AttributeError:“引擎”对象没有属性“中央走廊”
以下是关于分解需要解决的问题:
- 您应该将玩家的位置作为状态变量存储在
地图
中,而不是引擎
中。实际上,您应该将映射
重命名为位置
,因为它不仅仅记录它们的位置,它知道哪些操作是合法的并处理它们,然后更新到新位置
引擎
职业不需要知道玩家在哪里,只要他们活着或死了(他们携带的是什么,他们的能量水平如何,分数等等)
- 因此,试图初始化
引擎(“中央走廊”)
毫无意义。(顺便说一句,“central_走廊”是一个字符串,Map.central_走廊是一个方法,但这样做仍然是一个可怕的分解,您将无缘无故地将引擎耦合到Map)
引擎
类不需要知道如何初始化Map的实例
- 那么,如何编写
Map
类,使其自身将其位置初始化为“central_走廊”
- 位置应存储为数据成员(应设置或获取
Map
中的方法。Location=“central roadway”,“bridge”
),而不是作为方法Map.central\u roadway()
,Map.go\u to\u bridge()
。当然,如果你这样做了,你需要一个方法来处理每一个合法的来源-目的地对位置,这将是不必要的,除非冒险是非常线性的
Map
中的方法名,然后让Engine.play()
在这些位置(方法名)中循环Engine.play
只会让你头疼从Map
Engine
和合法通过的位置不必要地传递控制流动作
来自哪里?您缺少一个方法来请求玩家采取行动,并拒绝和循环,除非它在该位置认可合法行动None
以指示玩家已死亡李>
- 将
重命名为地图
位置
将有一个成员Location
(或where
或任何您想称之为的名称)state
或Engine
只需定义Engine.\uuuu init\uuu
。初始状态下禁止通行self.location=location()
Location
类应该有一个大方法turn()
,它检查self.Location
的当前值,打印任何相应的描述文本,调用一个方法来获得玩家操作(可能希望将一个法律操作列表作为字符串传递给它),然后处理该位置的选定动作,并确定下一个动作和下一个玩家状态(活动/死亡)您得到的错误的完整回溯是什么?我猜这与
next=Map()
有关,在这里您尝试初始化一个Map
而没有参数,但是需要一个next
参数。您在代码中哪里看到getattr()
调用?如果您需要任何帮助,请发布一个正确的MCVE和完整的错误消息并进行回溯。对不起,我把我的另一个版本放在这里了。我又更新了一次。你的代码中有很多错误,你没有在这里关闭字符串:print(“在绘图时快速拉出你的爆炸机并开火”),play方法写得很糟糕,你应该重新考虑一下你的代码。好的,你需要决定你在哪里存储玩家的位置(大概是作为地图中的状态变量,而不是引擎).1)Engine
类不需要知道玩家在哪里,只要他们活着或死了(他们携带的是什么,他们的能量水平是什么,分数等等)。所以尝试用引擎(“中央走廊”)初始化东西
毫无意义。引擎
类不需要知道如何初始化映射
的实例。2)因此,如何编写映射
类,使其自身将其位置初始化为“中央走廊”"? 2b)位置应存储为数据成员,而不是smci。我按照你说的重建了程序。很明显,我发现我完全不理解“类”的功能,这个问题太愚蠢了。但是再次感谢你指出我的问题。我应该读更多的文档,但一定要查看一般的代码审查
def __init__(self,start):
self.map = start
self.quips = [
"You died. You kinda suck at this.",
"Your mom would be proud. If she were smarter.",
"Such a luser.",
"I have a small puppy that's better at this."
]
def death(self):
print (self.quips[randint(0,len(self.quips) - 1)])
exit(1)
def play(self):
next = self.map
while True:
print ("\n------------------")
# Trying to get attribute of object and pass to class Map.
Map = getattr(self, next)
next = Map()
class Map():
def __init__(self, next):
self.map = next
def central_corridor(self):
print ("The Gothons of planet Percal #25 have invaded your ship and destryoed")
if action == "shoot!":
print ("Quick on the draw you yank out your blaster and fire)
return 'death'
elif action == 'tell a joke':
print ("Lucky for you they made you learn Gothon insults in the academy")
return 'Go to bridge'
def go_to_bridge(self):
print ("You burst onto the Bridge with the neutron destruct bomb")
a_game = Engine("central_corridor")
a_game.play()