2016-11-20 49 views
1

所以我一直在研究Zed Shaw的Learn Python The Hard Way并且在练习43之前取得了一些相当不错的成功,这个练习使用面向对象编程原理来创建一个非常简单的基于文本的游戏。我曾多次被得到一个属性错误,更specifially:如何在Python中调试AttributeError?

File "PracticeGame.py", line 206, in <module> 
a_game.play() 
    File "PracticeGame.py", line 20, in play 
    next_scene_name = current_scene.enter() 
AttributeError: 'NoneType' object has no attribute 'enter' 

我已经看到关于此错误的多个职位,但没有一个答案都真正解释的方式我能理解这个问题,也没有提供的解决方案为我工作。以下是从代码行包括20行:

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() 

    while True: 
     print "\n-------" 
     next_scene_name = current_scene.enter() #this is line 20 
     current_scene = self.scene_map.next_scene(next_scene_name) 
     return current_scene 

这是206

a_map = Map('central_corridor') 
a_game = Engine(a_map) 
a_game.play() #line 206 

作为图被限定的代码,包括行的末尾:

class Map(object): 

scenes = { 
    'central_cooridor': CentralCorridor(), 
    'laser_weapon_armory': LaserWeaponArmory(), 
    'the_bridge': TheBridge(), 
    'escape_pod': EscapePod(), 
    'death': Death() 
} 

def __init__(self, start_scene): 
    self.start_scene = start_scene 

def next_scene(self, scene_name): 
    return Map.scenes.get(scene_name) 

def opening_scene(self): 
    return self.next_scene(self.start_scene) 

我从明白不同的帖子,这个错误消息意味着第20行的一部分没有定义,但我失去了什么没有定义以及为什么发生。我是Python的新手。

+0

请发表'self.scene_map.opening_scene()'或'Map'的定义 – dm03514

+0

我刚加入帖子,在评论中看起来不太好 – Woomfy

回答

0

您的错误说明'NoneType' object has no attribute 'enter'。这意味着您有一些类型为NoneType的对象,并且您试图访问名为enter的属性。现在,Python已经完全顺从NoneTypeNone这个类型。因此,编译器试图告诉你,你在做X.enterXNone

现在让我们看看上下文。背景是: File "PracticeGame.py", line 20, in play next_scene_name = current_scene.enter() 从第一段开始,错误是current_sceneNone。现在你想通过程序追溯到current_scene来自哪里。在你的情况下,它来自Map.scenes.get(scene_name),其中scene_name = 'central_corridor'map.get没有找到密钥时返回None,所以这一定是你的问题。仔细观察,发现在地图定义中拼写错误的场景名称为'central_cooridor'

+0

非常感谢!这真的帮助我了解问题来自一个清晰简明的方式。在我把拳头穿过墙壁之后,我会修复拼写错误并测试出来。 – Woomfy