2016-11-20 8 views
1

だから私はZed Shawさんの仕事をしています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 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) 

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 

地図は以下のように定義されるの終わりですこのエラーメッセージは、行20の一部が定義されていないことを意味しますが、定義されていないものと発生している理由については分かりません。私はPythonが初めてです。

+0

'self.scene_map.opening_scene()'または 'Map'の定義を投稿してください。 – dm03514

+0

私はちょうどその投稿にそれを追加しました、コメントですばらしく見えませんでした – Woomfy

答えて

0

エラーは'NoneType' object has no attribute 'enter'と表示されます。つまり、タイプがNoneTypeのオブジェクトがあり、アトリビュートenterにアクセスしようとしています。さて、Pythonは、タイプNoneTypeNoneのexactly 1つのオブジェクトを持っています。したがって、コンパイラは、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

関連する問題