Как я могу сделать что-то подобное:
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)
Это ужасная идея?






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__