2010-06-11 2 views
2

Généralement, ne pas faire de programmation OO en Python. Ce projet l'exige et je rencontre un peu de problèmes. Voici mon code de grattage pour tenter de comprendre où il s'est mal passé:Comment définir des décorateurs multi-arguments dans une classe dans 2.6

class trial(object): 
    def output(func, x): 
     def ya(self, y): 
      return func(self, x) + y 
     return ya 
    def f1(func): 
     return output(func, 1) 
    @f1 
    def sum1(self, x): 
     return x 

qui ne compile pas. J'ai essayé d'ajouter le tag @staticmethod aux fonctions "output" et "f1" mais en vain. Normalement, je le ferais

def output(func, x): 
    def ya(y): 
     return func(x) + y 
    return ya 

def f1(func): 
    return output(func, 1) 

@f1 
def sum1(x): 
    return x 

qui ne fonctionne pas. Alors, comment puis-je obtenir cela dans une classe?

Répondre

5

Il n'y a pas besoin de vos décorateurs de méthode pour faire partie de la classe:

def output(meth, x): 
    def ya(self, y): 
     return meth(self, x) + y 
    return ya 

def f1(meth): 
    return output(meth, 1) 

class trial(object): 
    @f1 
    def sum1(self, x): 
     return x 

>>> trial().sum1(1) 
2 

J'ai tendance à utiliser meth au lieu de func dans les décorateurs, je sais que je vais appliquerai à des méthodes, juste pour essayer de garde le droit dans ma propre tête.

+0

Et si je l'accès à un élément de la classe? Comme au lieu de 'return func (x) + y', c'est' return func (x) + y + self.val'. Mon exemple ne montre pas ce qui signifie que je n'ai pas posé une question complète et correcte. – wheaties

+0

Cela fonctionnera bien. Notez que la méthode finale "replacement" (quel est le mot pour cette?), 'Ya', a accès à' self', qui sera l'instance sur laquelle la méthode est appelée. Vous pouvez faire n'importe quoi dans 'ya' que vous feriez dans une méthode normale sur la classe. –

-2

Pas moyen. Ceci est un mauvais design. Suivre pour The Zen of Python

Lorsque vous décorez une fonction appelant le décorateur par @, elle doit déjà être définie.

Vous devez d'abord définir le décorateur et décorer une fonction lors de la deuxième étape.

0

Essayez cette solution laide

class trial(object): 

    def __init__(self): 
     #doing this instead of @ statement 
     self.sum1 = self.f1(self.sum1) 

    def output(self, func, x): 
     def ya(y): 
      return func(x) + y 
     return ya 

    def f1(self, func): 
     return self.output(func, 1) 


    def sum1(self, x): 
     return x 

t = trial() 

print t.sum1(5) 
Questions connexes