我在学习LPTHW,一直在做我自己的游戏。你知道吗
class Engine(object):
location_dict = {
'main_corridor': MainCorridor(),
}
def goto(self, location):
return Engine.location_dict.get(location).start()
def test(self):
print "Calling Engine() from MainCorridor()"
class MainCorridor(object):
def __init__(self):
self.engine = Engine()
def start(self):
self.engine.test()
game = Engine()
game.goto('main_corridor')
有人能给我一些建议吗?非常感谢谢谢
以下是错误消息:
Traceback (most recent call last):
File "ex45_game.py", line 1, in <module>
class Engine(object):
File "ex45_game.py", line 4, in Engine
'main_corridor': MainCorridor()
NameError: name 'MainCorridor' is not defined
出现此错误是因为
location_dict
是类变量。在定义location_dict
时,您试图将MainCorridor
对象分配给location_dict
,但这是在定义MainCorridor
之前发生的,因此您会收到错误,因为它还不存在。如果在实例而不是类上定义location_dict
,则不会得到这个结果(见下文)。你知道吗另一方面,由于在对象之间来回切换,当我运行带有这些修改的代码时,我得到了一个
RuntimeError: maximum recursion depth exceeded
。当您创建Engine
的实例时,就会发生这种情况。请注意,当您创建Engine
时,它会创建一个MainCorridor
并将其放入dict。但是当您创建MainCorridor
时,它会创建一个Engine
,它会创建一个MainCorridor
并将其放入dict。但是当您创建MainCorridor
时。。。你知道吗我最近做了lpthw教程。Zed所做的是创建第三个类来映射游戏中的级别,这样就可以在其他类被定义之后实例化它们。这将修复“未定义”错误。你知道吗
但另一个问题是,您正在最后创建一个引擎对象:
然后在初始化MainCorridor类时,创建一个单独的引擎对象:
解决方案是仅在MainCorridor类中创建engine类:
但是这样,您在location目录中放置的每个location实例都将有自己唯一的引擎对象。你知道吗
为每个位置指定单个引擎对象可以做的是将'self'从引擎传递到map类,并让map类通过将相同的引擎对象传递到列表中的每个位置来实例化location\u dict:
相关问题 更多 >
编程相关推荐