Heim  >  Artikel  >  Backend-Entwicklung  >  Können Instanzattribute als Argumente an Klassenmethoden-Dekoratoren in Python übergeben werden?

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-18 12:02:36782Durchsuche

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>

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>

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>

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!

Stellungnahme:
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