Das Verständnis von Dekoratoren in Python
Dekorateure in Python sind eine leistungsstarke und flexible Möglichkeit, das Verhalten einer Funktion oder einer Klasse zu ändern. Sie sind eine Form von höherwertigen Funktionen (higher-order functions), was bedeutet, dass sie eine Funktion als Argument nehmen, ihr zusätzliche Funktionalität hinzufügen und dann eine neue Funktion zurückgeben können. Dies ermöglicht es Ihnen, die Funktionalität einer Funktion zu erweitern, ohne deren Kernlogik zu ändern.
Was sind Dekorateure?
Dekorateure sind eine Möglichkeit, eine Funktion mit einer anderen Funktion zu umhüllen. Die innere Funktion, die als "Dekorator" bekannt ist, führt typischerweise zusätzliche Verarbeitung oder Funktionalität vor oder nach dem Aufruf der ursprünglichen Funktion aus. Dies kann für Aufgaben wie Logging, Caching, Authentifizierung und vieles mehr nützlich sein.
Wie Dekorateure funktionieren
Dekorateure in Python werden mit dem @
-Symbol definiert, gefolgt vom Namen der Dekoratorfunktion, direkt vor der Funktionsdefinition platziert. Wenn eine Funktion dekoriert wird, wird die Dekoratorfunktion mit der ursprünglichen Funktion als Argument aufgerufen, und das Ergebnis der Dekoratorfunktion wird als neue Funktion verwendet.
Hier ist ein einfaches Beispiel eines Dekorators, der die an eine Funktion übergebenen Argumente protokolliert:
def log_args(func):
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__} with args={args} and kwargs={kwargs}")
return func(*args, **kwargs)
return wrapper
@log_args
def add_numbers(a, b):
return a + b
result = add_numbers(2, 3)
print(result)
Dies wird folgendes ausgeben:
Calling add_numbers with args=(2, 3) and kwargs={}
5
Dekoratorzusammensetzung
Dekorateure können kombiniert werden, sodass Sie mehrere Dekorateure auf eine einzelne Funktion anwenden können. Die Dekorateure werden von unten nach oben angewendet, wobei der innerste Dekorator zuerst angewendet wird.
def uppercase(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return wrapper
@uppercase
@log_args
def greet(name):
return f"Hello, {name}!"
print(greet("LabEx"))
Dies wird folgendes ausgeben:
Calling greet with args=('LabEx',) and kwargs={}
HELLO, LABEX!
Das Verständnis der *args
- und **kwargs
-Syntax
Die *args
- und **kwargs
-Syntax wird in Dekoratoren verwendet, um es dem Dekorator zu ermöglichen, Funktionen mit beliebig vielen Positions- und Schlüsselwortargumenten zu verarbeiten. *args
sammelt alle Positionsargumente in einem Tupel, während **kwargs
alle Schlüsselwortargumente in einem Wörterbuch sammelt.
Diese Flexibilität stellt sicher, dass der Dekorator auf eine Vielzahl von Funktionen angewendet werden kann, unabhängig von ihrer Argument-Signatur.