我正在学习python,学习python很难,而且我正在使用dict和class进行'游戏'。代码不完整,但主要问题是AttributeError。
我遇到了这个错误:
Traceback (most recent call last):
File "juego.py", line 86, in <module>
juego.play()
File "juego.py", line 60, in play
game.enter()
AttributeError: 'NoneType' object has no attribute 'enter'
代码:
class entry(): #OK
def enter(self):
print 'Llegaste a la primera habitacion, miras a tu alrededor...'
print 'y ves un boton rojo en la pared...'
print 'Que haces?'
print 'Apretas el boton?'
print 'O seguis mirando?'
boton_rojo = raw_input('> ')
if 'boton' in boton_rojo:
print 'Apretas el boton y...'
print 'Aparece una puerta adelante tuyo!'
return 'Rescate_Prisionero'
elif 'mir' in boton_rojo:
print 'Seguis mirando...'
print '...'
print 'no encontras nada y decidis apretar el boton rojo'
print 'Apretas el boton y...'
print 'Aparece una puerta adelante tuyo!'
else:
print 'eh? que dijiste?'
class rescate_prisionero():
def enter(self):
print 'parece que si'
return 'Mago_Poderoso'
class mago_poderoso():
def enter(self):
print 'trolo'
return 'Pelea_esqueleto'
class pelea_esqueleto():
def enter(self):
print 'esque'
return 'Habitacion_Vacia'
class habitacion_vacia():
def enter(self):
print 'vac'
return 'Final_Scene'
class final_scene():
def enter(self):
print 'parece que esta todo bien'
class Engine(object):
def __init__(self, primer_escena):
self.primer_escena = primer_escena
def play(self):
ultima_escena = Map.Escenas.get('Final_Scene')
game =self.primer_escena.arranque().enter()
while game != ultima_escena:
game = Map.Escenas.get(game)
game.enter()
class Map():
def __init__(self, primer_escena):
self.primer_escena = primer_escena
def arranque(self):
inicio = Map.Escenas.get(self.primer_escena)
return inicio
Escenas = { 'Entry' : Entry(),
'Rescate_Prisionero' : rescate_prisionero(),
'Mago_Poderoso' : mago_poderoso(),
'Pelea_esqueleto' : pelea_esqueleto(),
'Habitacion_Vacia' : habitacion_vacia(),
'Final_Scene' : final_scene()
}
pepe = Map('Entry')
juego = Engine(pepe)
juego.play()
编辑:抱歉,我忘记了错误,代码现已完成
答案 0 :(得分:0)
您收到此错误是因为在某些时候game
成为None
对象。这可能发生在许多不同的步骤,因此可能很难追查。如果您未找到密钥,则只要您拨打dict.get
,就会返回None
。
将所有dict.get(key)
语句更改为dict[key]
语句可能最容易。如果字典不包含密钥,似乎没有任何方法可以继续进行,因此抛出KeyError
肯定比稍后抑制错误更好。
您的Map.Escenas
个值中的一个或多个也可能是None
,所以即使dict.get
找到了值,它也会返回None
。这就是使用dict[key]
在这里有用的原因 - 至少你可以缩小范围!您没有包含任何函数中的任何代码:
Entry
rescate_prisionero
mago_poderoso
pelea_esqueleto
habitacion_vacia
final_scene
所以我们没办法在这里查看。