Ü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!