¿Cómo paso un campo de clase a un decorador en un método de clase como argumento? Lo que quiero hacer es algo como:
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization("some_attr", self.url)
def get(self):
do_work()
Se queja de que el yo no existe para pasar self.url
al decorador. ¿Hay alguna forma de evitar esto?
python
python-decorators
marca
fuente
fuente
Respuestas:
Si. En lugar de pasar el atributo de instancia en el momento de la definición de clase, verifíquelo en tiempo de ejecución:
El decorador intercepta los argumentos del método; El primer argumento es la instancia, por lo que lee el atributo de eso. Puede pasar el nombre del atributo como una cadena al decorador y usarlo
getattr
si no desea codificar el nombre del atributo:fuente
fuente
Un ejemplo más conciso podría ser el siguiente:
Que imprimirá:
fuente
Otra opción sería abandonar el azúcar sintáctico y decorar en
__init__
la clase.que imprimiría
fuente
No puedes No hay
self
en el cuerpo de la clase, porque no existe una instancia. Tendría que pasarlo, por ejemplo, questr
contenga el nombre del atributo para buscar en la instancia, que la función devuelta puede hacer, o usar un método completamente diferente.fuente