Comment passer un champ de classe à un décorateur sur une méthode de classe en tant qu'argument? Ce que je veux faire, c'est quelque chose comme:
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization("some_attr", self.url)
def get(self):
do_work()
Il se plaint que le moi n'existe pas pour passer self.url
au décorateur. Y a-t-il un moyen de contourner ceci?
python
python-decorators
marque
la source
la source
Réponses:
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:
Le décorateur intercepte les arguments de la méthode; le premier argument est l'instance, donc il lit l'attribut de cela. Vous pouvez transmettre le nom de l'attribut sous forme de chaîne au décorateur et l'utiliser
getattr
si vous ne souhaitez pas coder en dur le nom de l'attribut:la source
la source
Un exemple plus concis pourrait être le suivant:
Qui imprimera:
la source
Une autre option serait d'abandonner le sucre syntaxique et de décorer dans
__init__
la classe.qui imprimerait
la source
Vous ne pouvez pas. Il n'y a pas
self
dans le corps de la classe, car aucune instance n'existe. Vous devez le transmettre, par exemple, unstr
contenant le nom de l'attribut à rechercher sur l'instance, ce que la fonction retournée peut alors faire, ou utiliser une méthode entièrement différente.la source