2010-06-08 6 views
15

Aidez un gars à sortir. Ne peut pas sembler obtenir un décorateur pour travailler avec l'héritage. Brisé le plus petit exemple le plus simple dans mon espace de travail de travail. Je n'arrive toujours pas à le faire fonctionner.Décorateurs et héritage Python

class bar(object): 
    def __init__(self): 
     self.val = 4 
    def setVal(self,x): 
     self.val = x 
    def decor(self, func): 
     def increment(self, x): 
      return func(self, x) + self.val 
     return increment 

class foo(bar): 
    def __init__(self): 
     bar.__init__(self) 
    @decor 
    def add(self, x): 
     return x 

Oups, le nom "décor" n'est pas défini.

Ok, qu'en est-il de @bar.decor? TypeError: la méthode non liée "decor" doit être appelée avec une instance de barre comme premier argument (l'occurrence de la fonction got est à la place)

Ok, qu'en est-il de @self.decor? Le nom "self" n'est pas défini.

Ok, qu'en est-il de @foo.decor?! Le nom "foo" n'est pas défini.

AaaaAAaAaaaarrrrgggg ... Qu'est-ce que je fais mal?

+0

Dans votre exemple, vous pourriez avoir 'return x + self.val' pour la définition de' 'add' dans foo'. Ne pourriez-vous pas le faire dans votre code actuel? –

+0

Ceci est un exemple de code distillé mettant en évidence le problème auquel je faisais face. Si le code était aussi simple, alors oui. Cependant, ce n'est pas le cas. – wheaties

Répondre

19

Définir decor comme méthode statique et utiliser la forme @bar.decor:

class bar(object): 
    def __init__(self): 
     self.val = 4 
    def setVal(self,x): 
     self.val = x 
    @staticmethod 
    def decor(func): 
     def increment(self, x): 
      return func(self, x) + self.val 
     return increment 

class foo(bar): 
    def __init__(self): 
     bar.__init__(self) 
    @bar.decor 
    def add(self, x): 
     return x 
+0

Cela fonctionne encore mieux car 'self' n'est pas utilisé dans les deux définitions de fonctions. – exupero

+1

@EShull: En fait, 'decor' peut être une méthode statique, malgré la référence' self'. 'self' est seulement référencé dans' increment() ', et quand on appelle' f.add (10) 'sur une instance' foo', le paramètre 'self' dans' increment() 'référencera' f', et le l'incrément fonctionnera comme prévu. –

+0

Cela ressemble à ça va marcher. Je dois quitter le travail mais si c'est le cas, je vais signaler cela comme la réponse. Merci! – wheaties

Questions connexes