Heim >Backend-Entwicklung >Python-Tutorial >So übergeben Sie ein Klassenfeld an den Klassenmethoden-Dekorator

So übergeben Sie ein Klassenfeld an den Klassenmethoden-Dekorator

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-18 12:23:03369Durchsuche

How to Pass Class Field to Class Method Decorator

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

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