我正在通过Zed的LearnPythontheHardWay工作,我很困惑。
我得到了错误:
属性错误:“NoneType”对象没有属性“enter”
在行:next_scene_name = current_scene.enter()在Engine类下。
from sys import exit
class Scene(object):
def enter(self):
print "This scene is not yet configured. Subclass it and implement\
enter()."
exit(1)
class Engine(object):
def __init__(self, scene_map):
self.scene_map = scene_map
def play(self):
current_scene = self.scene_map.opening_scene()
last_scene = self.scene_map.next_scene('finished')
while current_scene != last_scene:
next_scene_name = current_scene.enter()
current_scene = self.scene_map.next_scene(next_scene_name)
current_scene.enter()
class EmptyScene(Scene):
def enter(self):
pass
class FinishScene(Scene):
def enter(self):
pass
class Map(object):
scenes = {
'empty_scene': EmptyScene(),
'finished': FinishScene(),
}
def __init__(self, start_scene):
self.start_scene = start_scene
def next_scene(self, scene_name):
val = Map.scenes.get(scene_name)
return val
def opening_scene(self):
return self.next_scene(self.start_scene)
a_map = Map('empty_scene')
a_game = Engine(a_map)
a_game.play()`发布于 2015-06-26 05:26:32
问题是current_scene实际上是None。这是由调用self.scene_map.next_scene调用dict.get引起的。使用dict.get的问题是,如果键不在字典中,那么它只会返回None,而不是像您预期的那样抛出异常。因此,您的程序继续运行,认为一切正常,直到稍后代码出现问题。
发布于 2015-06-26 05:26:06
这是因为current_scene是None,所以当您尝试enter()函数时,它会给出错误。
这样做的一种方法是提供一个if语句:
while current_scene != last_scene:
if current_scene != None:
next_scene_name = current_scene.enter()
current_scene = self.scene_map.next_scene(next_scene_name)
else:
break 发布于 2015-06-26 05:30:24
看来你的代码不完整。
出现此问题的原因是,您的current_scene第一次具有一个值,即empty_scene,然后尝试调用current_scene.enter()以获取下一个场景,但是EmptyScene类的enter方法不返回任何内容,因此您要返回None,然后将current_scene更改为是next_scene,即为None,并再次尝试在其中调用enter函数,从而引发问题。
您可以将while条件更改为-
while current_scene != last_scene and current_scene is not None:
next_scene_name = current_scene.enter()
current_scene = self.scene_map.next_scene(next_scene_name)如果希望finished成为empty_scene之后的下一个场景,则需要更改EmptyScene类以返回finished,而不是传递函数。例子-
class EmptyScene(Scene):
def enter(self):
return 'finished'https://stackoverflow.com/questions/31065462
复制相似问题