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 ?

Les attributs d'instance peuvent-ils être transmis comme arguments aux décorateurs de méthodes de classe en Python ?

Barbara Streisand
Libérer: 2024-10-18 12:02:36
original
929 Les gens l'ont consulté

Can Instance Attributes be Passed as Arguments to Class Method Decorators in 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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal