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.

Versuchen Sie es im Editor

Ü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)
Terminal-Ausgabe
Calling multiply with args: (5, 4)
multiply returned: 20

Schrittweise 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

Empfohlene Python-Ressourcen

Erweitern Sie Ihr Wissen mit zugehörigen interaktiven Tutorials, Spickzetteln und Codevergleichen.