2016-11-20 36 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