Oui. Au lieu de transmettre l'attribut d'instance au moment de la définition de la classe, vérifiez-le au moment de l'exécution :
def check_authorization(f):
def wrapper(*args):
print args[0].url
return f(*args)
return wrapper
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization
def get(self):
print 'get'
>>> Client('http://www.google.com').get()
http://www.google.com
get
Le décorateur intercepte les arguments de la méthode ; le premier argument est l'instance, il lit donc l'attribut à partir de celle-ci. Vous pouvez passer le nom de l'attribut sous forme de chaîne de caractères au décorateur et utiliser la fonction getattr
si vous ne voulez pas coder en dur le nom de l'attribut :
def check_authorization(attribute):
def _check_authorization(f):
def wrapper(self, *args):
print getattr(self, attribute)
return f(self, *args)
return wrapper
return _check_authorization