Словари и лямбда внутри класса?

Как я могу сделать что-то подобное:

class Foo():
 do_stuff = { 
            "A" : lambda x: self.do_A(x),
            "B" : lambda x: self.do_B(x)
        }
def __init__(self):
    print "hi"

def run(self):
    muh = ['A', 'B', 'A']
    for each in muh:
        self.do_stuff[each](each)

def do_A(self, moo):
    print "A"

def do_B(self, boo):
    print "B"

if (__name__ == '__main__'):
aFoo = Foo()
aFoo.run()

Это приводит к появлению ошибки, что self не определен в лямбда-функции, но если я ее удалю. Он говорит, что do_A или do_B не определены.

РЕДАКТИРОВАТЬ

Мне удалось в этом разобраться. Мне нужно изменить лямбда-выражение на что-то вроде этого:

lambda x, y: x.do_A(y)

и я бы назвал это так:

self.do_stuff[each](self, each)

Это ужасная идея?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
911
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

do_stuff не является переменной экземпляра в вашем примере. Это больше похоже на статическую переменную. Вам нужно определить do_stuff внутри метода (например, метода в этом), где у вас есть ссылка на self, чтобы сделать его переменной экземпляра. Надеюсь, этот пример проясняет вам ситуацию:

class Foo:

  def __init__(self):
    self.do_stuff = { "A": self.do_A, "B": self.do_B }

  def run(self):
    for x in ["A", "B"]:
      self.do_stuff[x]("hi")

  def do_A(self, x):
    pass

  def do_B(self, x):
    pass

Обратите внимание, что лямбда-функции не нужны. Вы можете просто хранить в словаре ссылки на сами функции. Обозначение «self.do_A» автоматически передаст self в качестве первого аргумента.

Обновлено: Кто-нибудь знает, как правильно отображать подчеркивания в тексте, не являющемся образцом кода?
Обновлено: WTH? В предварительном просмотре подчеркивания отображаются иначе, чем в сообщении.

Чтобы заставить работать символы подчеркивания, используйте \, чтобы избежать их, например __init__

Brian 14.11.2008 16:40

Другие вопросы по теме