Maison >développement back-end >Tutoriel Python >Les attributs d'instance peuvent-ils être transmis comme arguments aux décorateurs de méthodes de classe en Python ?
Passer des champs de classe aux décorateurs de méthodes de classe
En Python, les méthodes de classe peuvent être décorées à l'aide de décorateurs qui prennent des arguments supplémentaires. Cependant, des questions se posent lorsque l'on tente de transmettre des attributs d'instance comme arguments à ces décorateurs.
Considérons l'exemple suivant :
<code class="python">class Client(object): def __init__(self, url): self.url = url @check_authorization("some_attr", self.url) def get(self): do_work()</code>
L'intention est de transmettre l'attribut self.url au décorateur check_authorization. . Cependant, Python génère une erreur indiquant que self n'existe pas dans la portée de la définition de classe.
Solution
Pour résoudre ce problème, on peut différer la vérification des attributs au moment de l'exécution. en interceptant les arguments de la méthode dans le décorateur. Le premier argument de la fonction wrapper sera l'instance, permettant l'accès aux attributs de l'instance.
<code class="python">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() # Output: http://www.google.com # get</code>
Approche alternative
Alternativement, on peut accéder dynamiquement aux attributs en passant le nom de l'attribut sous forme de chaîne au décorateur. Cela élimine le besoin de coder en dur les noms d'attributs spécifiques.
<code class="python">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</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!