Heim >Backend-Entwicklung >Python-Tutorial >So übergeben Sie ein Klassenfeld an den Klassenmethoden-Dekorator
Übergabe eines Klassenfelds an den Klassenmethoden-Dekorator
Beim Versuch, ein Klassenfeld an einen Dekorator einer Klassenmethode zu übergeben, kann es zu einem Problem kommen Fehler, der besagt, dass das Feld nicht existiert. Dies liegt daran, dass Sie versuchen, das Feld zum Zeitpunkt der Klassendefinition zu übergeben, es zu diesem Zeitpunkt jedoch möglicherweise nicht verfügbar ist.
Lösung 1: Laufzeitprüfung
Um dieses Problem zu beheben, sollten Sie das Feld stattdessen zur Laufzeit überprüfen. Dies kann erreicht werden, indem der Dekorator so geändert wird, dass er die Methodenargumente abfängt, wobei das erste Argument die Instanz ist. Auf das Instanzattribut kann dann zugegriffen werden mit .:
<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()</code>
Lösung 2: Attributname als String
Wenn Sie eine harte Codierung des Attributnamens im Decorator vermeiden möchten , können Sie es als Zeichenfolge übergeben:
<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 vonSo übergeben Sie ein Klassenfeld an den Klassenmethoden-Dekorator. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!