首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用艰苦的方法学习Python示例#43

用艰苦的方法学习Python示例#43
EN

Stack Overflow用户
提问于 2015-06-26 05:18:12
回答 3查看 866关注 0票数 2

我正在通过Zed的LearnPythontheHardWay工作,我很困惑。

我得到了错误:

属性错误:“NoneType”对象没有属性“enter”

在行:next_scene_name = current_scene.enter()Engine类下。

代码语言:javascript
运行
复制
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()`
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-26 05:26:32

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-26 05:26:06

这是因为current_sceneNone,所以当您尝试enter()函数时,它会给出错误。

这样做的一种方法是提供一个if语句:

代码语言:javascript
运行
复制
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 
票数 1
EN

Stack Overflow用户

发布于 2015-06-26 05:30:24

看来你的代码不完整。

出现此问题的原因是,您的current_scene第一次具有一个值,即empty_scene,然后尝试调用current_scene.enter()以获取下一个场景,但是EmptyScene类的enter方法不返回任何内容,因此您要返回None,然后将current_scene更改为是next_scene,即为None,并再次尝试在其中调用enter函数,从而引发问题。

您可以将while条件更改为-

代码语言:javascript
运行
复制
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,而不是传递函数。例子-

代码语言:javascript
运行
复制
class EmptyScene(Scene):

    def enter(self):
        return 'finished'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31065462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档