Python-Dekoratoren: Funktionen umschließen und ändern
Lernen Sie Python-Dekoratoren, um das Funktionsverhalten dynamisch zu ändern. Verstehen Sie Wrapper-Funktionen, @-Syntax und den Umgang mit Argumenten in Dekoratoren.
Übersicht
Dekoratoren sind eines der elegantesten und leistungsstärksten Designmuster von Python. Sie ermöglichen Entwicklern, das Verhalten einer Funktion, Methode oder Klasse zu ändern oder zu erweitern, ohne den Quellcode dauerhaft zu ändern. Stellen Sie sich einen Dekorateur so vor, dass er eine Funktion in eine andere Funktion einschließt, um Vor- und Nachbearbeitungsschritte auszuführen. Dies macht Dekorateure ideal für die Umsetzung übergreifender Anliegen wie Protokollierung, Timing, Validierung oder Zugriffskontrolle.
Im Kern arbeiten Dekoratoren, weil Python-Funktionen erstklassige Bürger sind. Dies bedeutet, dass Funktionen als Argumente an andere Funktionen übergeben, von Funktionen zurückgegeben und Variablen zugewiesen werden können. Ein Dekorator ist einfach eine Funktion, die eine andere Funktion als Argument verwendet, eine verschachtelte Wrapper-Funktion definiert, die die ursprüngliche Funktion zusammen mit etwas zusätzlicher Logik ausführt, und diese Wrapper-Funktion zurückgibt, um das Original zu ersetzen.
Um die Anwendung von Dekoratoren einfach und sauber zu gestalten, stellt Python den syntaktischen Zucker „@decorator_name“ bereit, der direkt über der Zielfunktionsdefinition platziert wird. Beim Aufruf der dekorierten Funktion ruft Python stattdessen den Wrapper auf. Wenn die Funktion Parameter akzeptiert, muss der Wrapper beliebige Argumente („*args“ und „**kwargs“) akzeptieren und diese ordnungsgemäß weiterleiten. Wenn Sie Dekoratoren verstehen, können Sie hochgradig modularen, sauberen und DRY-Code (Don't Repeat Yourself) schreiben.
Code- und Ausführungsausgabe
Ein benutzerdefinierter Dekorator, der Details zur Funktionsausführung verfolgt und protokolliert.
def call_tracker(func):
"""Decorator that tracks and logs function execution details."""
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__} with args: {args}")
result = func(*args, **kwargs)
print(f"{func.__name__} returned: {result}")
return result
return wrapper
@call_tracker
def multiply(a, b):
return a * b
# Calling the decorated function
result = multiply(5, 4)Calling multiply with args: (5, 4)
multiply returned: 20Schrittweise Umsetzung
- Protokollieren von Laufzeitmetriken in Leistungsmonitoren
- Durchsetzung von Authentifizierungs- und Autorisierungsprüfungen auf Routen
- Zwischenspeichern oder Merken teurer Rechenergebnisse
Häufig gestellte Fragen
Wie gehen Dekorateure mit Argumenten um?
Durch die Verwendung von *args und **kwargs in der verschachtelten Wrapper-Funktion können beliebige Positions- oder Schlüsselwortparameter empfangen und an die Wrapper-Funktion weitergeleitet werden.
Können Sie mehrere Dekoratoren auf eine Funktion anwenden?
Ja, Sie können sie stapeln. Sie werden in der Reihenfolge von oben nach unten ausgeführt (vom innersten zum äußersten Wrap).
Verwandte Themen
Beherrschen Sie Python-Funktionen. Erfahren Sie, wie Sie mit def wiederverwendbaren Code schreiben, Argumente definieren, Werte zurückgeben und den lokalen und globalen Bereich verstehen.
Python-KontextmanagerErfahren Sie, wie Sie benutzerdefinierte Kontextmanager in Python schreiben. Beherrschen Sie den Contextmanager-Dekorator und die Methoden __enter__/__exit__ für die Ressourcensicherheit.
Empfohlene Python-Ressourcen
Erweitern Sie Ihr Wissen mit zugehörigen interaktiven Tutorials, Spickzetteln und Codevergleichen.
So sortieren Sie eine Liste in Python
Erfahren Sie, wie Sie eine Liste in Python mit der Methode sort() und der Funktion sorted() sortieren. Entdecken Sie Beispiele für benutzerdefinierte Schlüsselsortierung und umgekehrte Reihenfolge.
Spickzettel für Python-String-Methoden
Ein vollständiges Referenzhandbuch für die Python-String-Manipulation. Meistern Sie das Formatieren, Suchen, Teilen, Ersetzen und Überprüfen von Zeichenfolgeneigenschaften.
Python vs. JavaScript: Welche Programmiersprache ist die beste?
Ein umfassender Vergleich zwischen Python und JavaScript. Entdecken Sie Syntaxunterschiede, Leistung, Anwendungsfälle (Backend vs. Frontend) und Codierungsbeispiele.