2008-11-13 1 views
3

Comment puis-je faire quelque chose comme ceci:Dictonaries et Lambda dans une classe?

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() 

Il en résulte qu'il donne une erreur que l'auto ne se définit pas à la fonction lambda, mais si je le supprimer. Il dit que do_A ou do_B n'est pas défini.

EDIT

j'ai réussi à comprendre. Je dois changer l'expression lambda en quelque chose comme ceci:

lambda x, y: x.do_A(y) 

et je voudrais l'appeler comme:

self.do_stuff[each](self, each) 

Est-ce une idée terrible? Do_stuff n'est pas une variable d'instance dans votre exemple.

Répondre

7

C'est plus comme une variable statique. Vous devez définir do_stuff dans une méthode (par exemple, la méthode init) où vous avez une référence à self pour en faire une variable d'instance. J'espère que cet exemple clarifie les choses pour vous:

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 

Notez que les fonctions lambda ne sont pas nécessaires. Vous pouvez simplement stocker des références aux fonctions elles-mêmes dans votre dictionnaire. La notation "self.do_A" passera automatiquement le soi comme premier argument.

EDIT: Est-ce que quelqu'un sait comment afficher les traits de soulignement correctement dans un texte non-code-échantillon?
EDIT: WTH? L'aperçu affiche des underscores différemment de la publication.

+0

+1: Plus simple. Pas de Lambda. –

+0

Pour que les caractères de soulignement fonctionnent, utilisez \ pour leur échapper, par exemple \ _ \ _ init \ _ \ _ – Brian