Sim. Em vez de transmitir o atributo de instância no momento da definição da classe, verifique-o em tempo de execução:
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
O decorador intercepta os argumentos do método; o primeiro argumento é a instância, então ele lê o atributo disso. Você pode passar o nome do atributo como uma sequência para o decorador e usá- getattr
lo se não desejar codificar o nome do atributo:
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