我正在通过Zed Shaw的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()`
答案 0 :(得分:2)
问题是current_scene
实际上是None
。这是由致电self.scene_map.next_scene
来调用dict.get
引起的。使用dict.get
的问题是,如果密钥不在字典中,那么它将返回None
而不是像您期望的那样抛出异常。因此,您的程序会继续运行,认为一切正常,直到代码中出现问题为止。
答案 1 :(得分:1)
这种情况正在发生,因为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
答案 2 :(得分:1)
好像您的代码不完整。
出现此问题是因为第一次,您的current_scene的值为empty_scene
,然后您尝试调用current_scene.enter()
来获取下一个场景,但是EmptyScene
类&#39 ; 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'