2017-01-07 6 views
1

Я пытаюсь поместить функцию, которая была сделана в классе внутри словаря, но продолжать получать ошибку «имя« яйца »не определена. Это то, что я пытался до сих пор,Функции в классах в словаре

class spam(object): 
    def __init__(self,my_dict={'eggs',eggs}): 
     self.my_dict=my_dict 
    def eggs(self): 
     print('eggs') 

Я также попытался использовать вне класса

class spam(object): 
    def __init__(self,my_dict): 
     self.my_dict=my_dict 
    def eggs(self): 
     print('eggs') 

my_dict={'eggs':eggs} 

Я также попытался заменить этот словарь с:

{'eggs':eggs()} 
{'eggs':spam.eggs} 
{'eggs':spam.eggs()} 

Может кто-либо скажите мне, как создать этот словарь или другой способ вызвать эту функцию на основе ввода строки.

+1

что вы до этого точно? Вы уверены, что '__int__' - это имя, которое вы используете, а не' __init__'? Однако зачем создавать словарь, содержащий функции? Это то, что классы по сути делают, у них есть '__dict__', который содержит эту информацию. –

+0

Это была ошибка, я использовал __init__ в фактическом коде –

ответ

1

Чтобы получить доступ к этой функции, необходимо создать экземпляр класса. Вы можете сделать это за пределами класса:

{'eggs':spam().eggs} 
+0

Это не решение вопроса. Он не разрешает NameError. –

+0

@NiklasR, no 'NameError' возникает, когда я запускаю его в Python 3.6 – ForceBru

+0

Он все равно будет давать' NameError', когда OP пытается использовать эту переменную в качестве значения по умолчанию в 'def __init __ (self, my_dict = eggs)' –

1

Вне класса, eggs не является статическим классом-метод, так что вы не можете получить к нему доступ без экземпляра класса как

{'eggs': spam().eggs} 

Вы можете рассмотрим статический-ную его, если вы хотите, используя

@staticmethod 
def eggs(): 
    print('eggs') 

Так как материал {'eggs': spam.eggs} будет работать.

+0

@ Спасибо, Jean-FrançoisFabre. fixed – Uriel

+0

Я думаю, что он работает только с python 3.5 или 3.6. Тем не менее 'NameError: name 'spam' не определен' –

+0

Нет, вы были правы. Это не удалось на 3.5. Порядок создания метода – Uriel

1

Создайте словарь внутри __init__().

class spam(object): 
    def __init__(self, my_dict=None): 
    if my_dict is None: 
     my_dict = {'eggs': self.eggs} 
    self.my_dict = my_dict 

Если вы хотите сохранить оригинальный метод, а не метод связанного экземпляра, используйте spam.eggs или type(self).eggs (оба имеют несколько другую семантику).

Смежные вопросы