¿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.urlal 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
getattrsi 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
selfen el cuerpo de la clase, porque no existe una instancia. Tendría que pasarlo, por ejemplo, questrcontenga el nombre del atributo para buscar en la instancia, que la función devuelta puede hacer, o usar un método completamente diferente.fuente