Heim >Backend-Entwicklung >Python-Tutorial >Erklärung der Python-Decorator-Definition und Anwendungsbeispiele
Im folgenden Artikel erfahren wir, was Python-Dekoratoren sind. Erfahren Sie mehr über das relevante Wissen über Python-Dekoratoren sowie über die Verwendung von Python-Dekoratoren. Okay, beginnen wir ohne weitere Umschweife mit dem nächsten Artikel.
Python Decorator
Kurz gesagt, PythonDecorator ist eine Funktion, die verwendet wird, um die Funktionalität der ursprünglichen Funktion zu erweitern. Diese Funktion ist etwas Besonderes ist, dass sein Rückgabewert auch eine Funktion ist. Der Vorteil der Verwendung von Python-Dekoratoren besteht darin, der Funktion neue Funktionen hinzuzufügen, ohne den Code der ursprünglichen Funktion zu ändern.
Da eine Funktion auch ein Objekt ist und Funktionsobjekte Variablen zugewiesen werden können, kann die Funktion auch über Variablen aufgerufen werden.
>>> def now(): ... print('2015-3-25') ... >>> f = now >>> f() 2015-3-25
Das Funktionsobjekt hat ein __name__-Attribut. Sie können den Namen der Funktion erhalten:
>>> now.__name__ 'now' >>> f.__name__ 'now'
Angenommen, wir möchten beispielsweise die Funktion der Funktion now() verbessern, Protokolle werden automatisch vor und nach dem Funktionsaufruf gedruckt, Sie möchten jedoch die Definition der Funktion now() nicht ändern. Diese Methode zum dynamischen Hinzufügen von Funktionen während der Ausführung des Codes wird als „Decorator“ bezeichnet.
Im Wesentlichen ist ein Dekorator eine Funktion höherer Ordnung, die eine Funktion zurückgibt. Daher müssen wir einen Dekorator definieren, der Protokolle drucken kann, der wie folgt definiert werden kann:
def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
Beobachten Sie das obige Protokoll, da es sich um einen Dekorator handelt, der eine Funktion als Parameter akzeptiert und eine Funktion zurückgibt. Wir müssen die @-Syntax von Python verwenden, um den Dekorator an der Definition der Funktion zu platzieren:
@log def now(): print('2015-3-25')
Durch den Aufruf der Funktion now() wird nicht nur die Funktion now() selbst ausgeführt, sondern auch eine Zeile gedruckt, bevor die Funktion ausgeführt wird now()-Funktionsprotokoll:
>>> now() call now(): 2015-3-25
Das Einfügen von @log in die Definition der now()-Funktion entspricht der Ausführung der Anweisung:
now = log(now)
Da log() ein Dekorator ist und eine Funktion zurückgibt, also ursprünglich Die Funktion now() existiert noch, aber jetzt zeigt die gleichnamige Variable now auf die neue Funktion, sodass beim Aufruf von now() die neue Funktion ausgeführt wird, d. h. die im Protokoll zurückgegebene Funktion wrapper() ( ) Funktion.
Die Parameterdefinition der Wrapper()-Funktion lautet (*args, **kw). Daher kann die Wrapper()-Funktion Aufrufe mit beliebigen Parametern akzeptieren. Innerhalb der Funktion wrapper() wird zuerst das Protokoll gedruckt und dann die ursprüngliche Funktion aufgerufen.
Wenn der Dekorator selbst Parameter übergeben muss, müssen Sie eine Funktion höherer Ordnung schreiben, die den Dekorator zurückgibt, was komplizierter zu schreiben ist. Um beispielsweise den Text des Protokolls anzupassen:
def log(text): def decorator(func): def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator
Die Verwendung dieses dreischichtigen verschachtelten Dekorators ist wie folgt:
@log('execute') def now(): print('2015-3-25')
Das Ausführungsergebnis ist wie folgt:
>>> now() execute now(): 2015-3-25
und der zweischichtige verschachtelte Dekorator Im Vergleich zum Dekorator ist der Effekt der drei Verschachtelungsebenen wie folgt:
>>> now = log('execute')(now)
Lassen Sie uns zunächst die obige Anweisung analysieren, die zurückgibt die Dekoratorfunktion und ruft dann die zurückgegebene Funktion und Parameter auf. Es handelt sich um die Now-Funktion, und der Rückgabewert ist letztendlich die Wrapper-Funktion.
Es gibt kein Problem mit den beiden oben genannten Definitionen von Dekorateur, aber es bleibt noch ein letzter Schritt übrig. Da wir gesagt haben, dass Funktionen auch Objekte sind, haben sie Attribute wie __name__, aber wenn Sie sich die vom Dekorator dekorierten Funktionen ansehen, hat sich ihr __name__ vom ursprünglichen „jetzt“ in „wrapper“ geändert:
>>> now.__name__' wrapper'
Weil Der Name der zurückgegebenen Funktion „wrapper“ lautet „wrapper“. Sie müssen den __name__ und andere Attribute der ursprünglichen Funktion in die Funktion „wrapper“ kopieren. Andernfalls werden einige Codes, die auf Funktionssignaturen basieren, falsch ausgeführt.
Es ist nicht erforderlich, Code wie „wrapper.__name__ = func.__name__“ zu schreiben. Daher wird ein vollständiger Dekorator wie folgt geschrieben:
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw) print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
Oder für Dekorateure mit Parametern:
import functoolsdef log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator
import functools dient zum Importieren des Functools-Moduls. Das Konzept der Module wird später erläutert. Denken Sie jetzt daran, @functools.wraps(func) hinzuzufügen, bevor Sie wrapper() definieren.
Das Obige ist der gesamte Inhalt dieses Artikels. Dieser Artikel stellt hauptsächlich das Wissen im Zusammenhang mit Python-Dekorator vor. Ich hoffe, dass das, was ich in diesem Artikel beschrieben habe, für Sie hilfreich ist und Ihnen das Erlernen von Python erleichtert.
Weitere Informationen zu diesem Thema finden Sie in der Spalte Python-Tutorial auf der chinesischen PHP-Website.
Das obige ist der detaillierte Inhalt vonErklärung der Python-Decorator-Definition und Anwendungsbeispiele. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!