Einführung von Decorators und grundlegende Verwendung
In diesem Schritt führen wir das Konzept von Decorators in Python ein und lernen, wie man sie für die grundlegende Funktionsdekoration verwendet. Decorators sind ein mächtiges Feature, das es Ihnen ermöglicht, Funktionen oder Methoden zu modifizieren oder zu verbessern, ohne deren Quellcode zu ändern.
Ein Decorator ist im Wesentlichen eine Funktion, die eine andere Funktion als Argument nimmt und eine neue Funktion zurückgibt, die normalerweise das Verhalten der ursprünglichen Funktion erweitert.
Beginnen wir mit der Erstellung einer einfachen Funktion, die wir dekorieren möchten. Öffnen Sie das integrierte Terminal in der WebIDE und navigieren Sie zum Verzeichnis ~/project
.
Erstellen Sie nun eine neue Python-Datei namens decorator_example.py
im Verzeichnis ~/project
über den Dateiexplorer der WebIDE. Öffnen Sie die Datei und fügen Sie den folgenden Code hinzu:
from datetime import datetime
def hello(name):
print(f'Hello {name}')
## Rufen Sie die ursprüngliche Funktion auf
hello('Tom')
Speichern Sie die Datei. Führen Sie nun das Skript im Terminal aus:
python ~/project/decorator_example.py
Sie sollten die Ausgabe sehen:
Hello Tom
Erstellen wir nun eine einfache Decorator-Funktion, die das aktuelle Datum und die Uhrzeit ausgibt, bevor die dekorierte Funktion ausgeführt wird. Fügen Sie den folgenden Code zu decorator_example.py
hinzu:
from datetime import datetime
from functools import wraps ## Dies werden wir später verwenden
def print_datetime(func):
def wrapper(*args, **kw):
print(datetime.now())
func(*args, **kw)
return wrapper
def hello(name):
print(f'Hello {name}')
## Wenden Sie den Decorator manuell an
f = print_datetime(hello)
f('Tom')
## Rufen Sie die ursprüngliche Funktion erneut auf, um den Unterschied zu sehen
hello('Jerry')
Speichern Sie die Datei und führen Sie sie erneut aus:
python ~/project/decorator_example.py
Sie sollten eine Ausgabe ähnlich dieser sehen:
Hello Tom
<current_datetime>
Hello Tom
Hello Jerry
Beachten Sie, dass beim Aufruf von f('Tom')
die wrapper
-Funktion des print_datetime
-Decorators ausgeführt wurde, die zuerst das aktuelle Datum und die Uhrzeit ausgab und dann die ursprüngliche hello
-Funktion aufrief. Als wir hello('Jerry')
direkt aufriefen, wurde nur die ursprüngliche hello
-Funktion ausgeführt.
Python bietet eine bequemere Syntax für die Anwendung von Decorators mit dem @
-Symbol. Modifizieren wir den Code, um die @
-Syntax zu verwenden. Aktualisieren Sie decorator_example.py
wie folgt:
from datetime import datetime
from functools import wraps
def print_datetime(func):
def wrapper(*args, **kw):
print(datetime.now())
func(*args, **kw)
return wrapper
@print_datetime
def hello(name):
"""Dies ist der Docstring für die hello-Funktion."""
print(f'Hello {name}')
## Rufen Sie die dekorierte Funktion auf
hello('Tom')
## Überprüfen Sie den Namen der dekorierten Funktion
print(f"Function name: {hello.__name__}")
Speichern Sie die Datei und führen Sie sie aus:
python ~/project/decorator_example.py
Die Ausgabe sollte ähnlich dieser sein:
<current_datetime>
Hello Tom
Function name: wrapper
Wie Sie sehen können, ist die Verwendung der @print_datetime
-Syntax äquivalent zu hello = print_datetime(hello)
. Die dekorierte Funktion hello
ist nun tatsächlich die wrapper
-Funktion, die vom Decorator zurückgegeben wird. Deshalb zeigt hello.__name__
'wrapper' an.
Im nächsten Schritt lernen wir, wie wir die Metadaten der ursprünglichen Funktion (wie ihren Namen und Docstring) bei der Verwendung von Decorators mithilfe von functools.wraps
erhalten.