2015-08-18 3 views
1

Я пытаюсь использовать словарь с функцией как значение, ноНевозможно использовать функцию из словаря

NameError: name 'oak' is not defined 

останавливает выполнение перед показом что-нибудь еще.

Это класс с диспетчером:

from hab_oak import Oak 
from pokemon import Pokemon 
from hab_brock import GimnasioBrock 

class Juego(object): 

    habs = { 
     'Oak' : oak 
    } 

    def __init__(self): 
     oak = Oak() 
     maproom, pok = oak.execution() 
     self.Pokemon = pok 
     dispatcher(Juego.habs.get(maproom), self.Pokemon) 


    def dispatcher(command, arg): 
     send(habs[command](arg)) 


    def oak(self, pokemon): 
     GimnasioBrock(pokemon) 

Я довольно уверен, что следующий класс Дуб не один дает ошибку, но это один из которых конкретизируется в Juego. инициализации

from sys import exit 
from random import randint 
from pokemon import Pokemon 
from hab_brock import GimnasioBrock 

class Oak(object): 

    def execution(self): 
     print "Bienvenido, soy Oak. Elige un pokemon." 
     print "Puedes elegir Charmander, Squirtle o Bulbasaur:" 

     pokemon_elegido = raw_input("> ") 

     if (pokemon_elegido == "Charmander"): 
      pokemon = Pokemon("Charmander", 20, 5) 
     elif (pokemon_elegido == "Bulbasaur"): 
      pokemon = Pokemon("Bulbasaur", 20, 5) 
     elif(pokemon_elegido == "Squirtle"): 
      pokemon = Pokemon("Squirtle", 20, 5) 

     print "Te enfrentaras a Brock." 

     return "Oak", pokemon 
+4

Вы используете dict как [переменную класса, а не переменную экземпляра] (https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables), поэтому «дуб 'не определяется при его вычислении. –

+1

Это очень запутанно иметь «дуб» и «дуб» как в этой программе – mauve

+1

'NameError', gotta catch em all –

ответ

1

Вы устанавливаете значение словаря в функции перед функция была определена классом. Если вы хотите сохранить функцию в переменной класса либо изменить oak() на статический метод или установить функцию в качестве значения в __init__()

Статический метод Пример:

class Juego(object): 

    habs = { 
     'Oak' : Juego.oak() 
    } 

    @staticmethod 
    def oak(pokemon): 
     GimnasioBrock(pokemon) 

Init Пример:

class Juego(object): 

    habs = {} 

    def __init__(self): 
     oak = Oak() 
     maproom, pok = oak.execution() 
     self.Pokemon = pok 
     dispatcher(Juego.habitaciones.get(maproom), self.Pokemon) 
     self.habs.update({'Oak':self.oak}) 

    def oak(self, pokemon): 
     GimnasioBrock(pokemon) 
Смежные вопросы