学习Python艰难的例子#43

时间:2015-06-26 05:18:12

标签: python

我正在通过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()`

3 个答案:

答案 0 :(得分:2)

问题是current_scene实际上是None。这是由致电self.scene_map.next_scene来调用dict.get引起的。使用dict.get的问题是,如果密钥不在字典中,那么它将返回None而不是像您期望的那样抛出异常。因此,您的程序会继续运行,认为一切正常,直到代码中出现问题为止。

答案 1 :(得分:1)

这种情况正在发生,因为current_sceneNone所以当您尝试使用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'