2014-06-24 4 views
2

Probablement que j'aborde le problème de la mauvaise façon et il existe une solution plus simple, mais voici mon problème.Appelez décorateur avec la variable de classe en python

J'ai un décorateur défini comme ceci:

def my_decorator(argument): 
    def wrap(f): 
     def wrapped_f(*args, **kwargs): 
      .... # does something with argument 
     return wrapped_f 
    return wrap 

je défini une classe qui ressemble à ceci:

class MyClass(object): 
    def __init__(argument): 
     self.argument = argument 

    @my_decorator(self.argument) # !this is an error! 
    def my_method(self): 
     .... # does something 

clairement ce que j'ai écrit est faux parce qu'au niveau décorateur je ne peux pas l'accès self, mais quelle est la bonne approche pour résoudre ce problème?

Répondre

2

Vous pourriez avoir l'accès décorateur self.argument intérieur wrapped_f:

def mydecorator(f): 
    def wrapped_f(self, *args, **kwargs): 
     argument = self.argument 
     .... # does something with argument 
     return f(self, *args, **kwargs) 
    return wrapped_f 
return wrap 

Si la variable passée en argument change en fonction de la fonction décore, vous pouvez passer au décorateur comme une chaîne et utiliser getattr à obtenir de self:

def my_decorator(arg_name): 
    def wrap(f): 
     def wrapped_f(self, *args, **kwargs): 
      argument = getattr(self, arg_name) 
      .... # does something with argument 
     return wrapped_f 
    return wrap 

class MyClass(object): 
    def __init__(self, argument): 
     self.argument = argument 

    @my_decorator("argument") 
    def my_method(self): 
     .... does something 
+0

Je savais que j'oubliais quelque chose! Beaucoup plus facile que ce que je pensais! Merci! –

+0

Mais comment 'self' est-il passé à' wrapped_f'? Je reçois un 'TypeError: my_method() manque 1 argument positionnel requis: 'self'. – Wtower

+0

@Wtower Python passe automatiquement 'self' à' my_method', car 'my_method()' est une méthode d'instance de 'MyClass'. Il semble que vous décoriez une fonction régulière, qui n'obtient pas automatiquement le paramètre 'self'. – dano