Können Instanzattribute als Argumente an Klassenmethoden-Dekoratoren in Python übergeben werden?

Barbara Streisand
Freigeben: 2024-10-18 12:02:36
Original
781 Leute haben es durchsucht

Can Instance Attributes be Passed as Arguments to Class Method Decorators in Python?

Übergabe von Klassenfeldern an Klassenmethoden-Dekoratoren

In Python können Klassenmethoden mithilfe von Dekoratoren dekoriert werden, die zusätzliche Argumente annehmen. Beim Versuch, Instanzattribute als Argumente an diese Dekoratoren zu übergeben, treten jedoch Fragen auf.

Betrachten Sie das folgende Beispiel:

<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>
Nach dem Login kopieren

Die Absicht besteht darin, das Attribut self.url an den Dekorator check_authorization zu übergeben . Allerdings gibt Python einen Fehler aus, der darauf hinweist, dass self im Klassendefinitionsbereich nicht vorhanden ist.

Lösung

Um dieses Problem zu beheben, kann man die Attributprüfung auf die Laufzeit verschieben durch Abfangen der Methodenargumente im Dekorator. Das erste Argument der Wrapper-Funktion ist die Instanz, die den Zugriff auf Instanzattribute ermöglicht.

<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>
Nach dem Login kopieren

Alternativer Ansatz

Alternativ kann man durch Übergabe dynamisch auf Attribute zugreifen den Attributnamen als String an den Dekorator weiter. Dadurch entfällt die Notwendigkeit, bestimmte Attributnamen fest zu codieren.

<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>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonKönnen Instanzattribute als Argumente an Klassenmethoden-Dekoratoren in Python übergeben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!