Gehen wir über die Grundlagen hinaus, um Dekorateure eingehend zu verstehen. Bei Dekoratoren geht es nicht nur um „zusätzliche Ebenen“, sondern sie bieten eine raffinierte Möglichkeit, Funktionen dynamisch um Funktionalität zu erweitern, wodurch sie äußerst anpassungsfähig und leistungsstark werden.
Im Wesentlichen ist ein Dekorator eine Funktion höherer Ordnung – eine Funktion, die eine andere Funktion als Argument akzeptiert, Funktionalität hinzufügt und eine neue Funktion zurückgibt. Dies ermöglicht es uns, eine ursprüngliche Funktion mit zusätzlichen Funktionen zu „dekorieren“, wobei die ursprüngliche Funktion unverändert bleibt.
Syntax-Zusammenfassung:
@decorator_name def my_function(): pass
Die Verwendung von @decorator_name vor my_function ist eine Abkürzung für:
my_function = decorator_name(my_function)
Lassen Sie uns einen einfachen Dekorator konstruieren, der protokolliert, wenn eine Funktion aufgerufen wird.
def log_call(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__}") return func(*args, **kwargs) return wrapper @log_call def greet(name): print(f"Hello, {name}!") greet("Alice") # Outputs: Calling greet, then Hello, Alice!
Dekorateure werden häufig verwendet für:
Manchmal benötigen Dekorateure zusätzliche Parameter. In diesen Fällen fügen wir eine äußere Funktion hinzu, um Parameter an den Dekorator zu übergeben.
Beispiel:
def repeat(times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(times): func(*args, **kwargs) return wrapper return decorator @repeat(3) def say_hello(): print("Hello!") say_hello() # Outputs "Hello!" three times
Hier ist „repeat“ eine Dekoratorfabrik, die einen Dekorator basierend auf dem Zeitargument generiert.
Sie können mehrere Dekoratoren auf einer einzigen Funktion stapeln und so eine leistungsstarke Kette von Verhaltensweisen erstellen.
Beispiel:
def make_bold(func): def wrapper(): return "<b>" + func() + "</b>" return wrapper def make_italic(func): def wrapper(): return "<i>" + func() + "</i>" return wrapper @make_bold @make_italic def greet(): return "Hello!" print(greet()) # Outputs: <b><i>Hello!</i></b>
Stapelung von @make_bold- und @make_italic-Umbrüchen in fetten und kursiven Tags.
Beim Dekorieren von Funktionen möchten Sie häufig, dass die Metadaten der ursprünglichen Funktion (wie Name und Dokumentzeichenfolge) erhalten bleiben. Verwenden Sie functools.wraps, um sicherzustellen, dass Ihr Wrapper diese Details nicht überschreibt.
from functools import wraps def log_call(func): @wraps(func) def wrapper(*args, **kwargs): print(f"Calling {func.__name__}") return func(*args, **kwargs) return wrapper
@wraps(func) stellt sicher, dass der Name und die Dokumentzeichenfolge von func beibehalten werden.
Dekoratoren sind nicht nur für eigenständige Funktionen da; Sie können auch mit Klassenmethoden verwendet werden.
Beispiel:
@decorator_name def my_function(): pass
Der require_auth-Dekorator prüft, ob der Benutzer authentifiziert ist, bevor er Zugriff auf die access_dashboard-Methode gewährt.
Dekoratoren sind ein unschätzbar wertvoller Bestandteil von Python und ermöglichen es Ihnen, das Funktionsverhalten auf flexible und wiederverwendbare Weise zu verbessern, zu ändern und zu steuern. Sie machen Ihren Code ausdrucksvoller, modularer und eleganter. Mit Dekoratoren fügen Sie nicht nur Funktionalität hinzu – Sie verfeinern und bereichern Ihre Codebasis.
Das obige ist der detaillierte Inhalt vonPython-Dekoratoren: Mehr Verständnis für die Funktionserweiterung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!