Implementieren Sie mehrere Decorators in Python
- Implementieren Sie einen Decorator: Funktioniert als erstklassige Objekte
- Implementieren Sie einen parametrisierten Decorator in Python
-
Implementieren Sie Decorator mit
@
in Python - Implementieren Sie mehrere Decorators in Python
- Abschluss
Eines der wichtigsten Features von Python ist, dass wir Decorators verwenden können, um das Verhalten von Funktionen oder Klassen zu ändern. Wir können Decorators verwenden, um Änderungen in einem Teil des Programms mit Codes vorzunehmen, die bereits im Programm enthalten sind.
Decorators sind Codezeilen in einem Programm, die einen Teil dieses Programms während der Ausführung ändern. Der Prozess, während der Kompilierung Änderungen an einem Programm hervorzurufen, wird als Metaprogrammierung bezeichnet.
In diesem Artikel wird der Leser die Grundlagen von Decorators durchgehen, d. h. wie sie in Python deklariert, implementiert und verkettet werden.
Implementieren Sie einen Decorator: Funktioniert als erstklassige Objekte
Syntaktisch können wir Dekoratoren deklarieren, indem wir eine Funktion als iterierbares Objekt an eine andere übergeben. Dies ist möglich, weil alles in Python ein erstklassiges Objekt ist; Daher können wir jedes Python-Konstrukt als Parameter übergeben oder einer Variablen zuweisen.
Das bedeutet, dass jede Klasse, Funktion und deklarierte Variable als Objekte übergeben werden kann. Die folgenden Beispiele zeigen dies:
Code:
def func():
def inner():
print("Chocolate")
return inner
taste = func()
taste()
Ausgang:
"C:\Users\Win 10\main.py"
Chocolate
Process finished with exit code 0
Hier wird eine verschachtelte Funktion erstellt, bei der die übergeordnete Funktion func()
eine innere Funktion inner()
hat. Die Funktion inner()
gibt eine Anweisung aus und gibt sich selbst zurück, während sie sich innerhalb einer Funktion befindet.
Die Decorator-Funktion func()
übergibt ihre Daten an eine leere Objektfunktion taste
. So dekorieren.
Wenn diese Objektfunktion irgendeine Funktionalität hätte, hätte der Dekorateur auch Änderungen daran vorgenommen. In den letzten Teilen dieses Artikels werden Sie sehen, wie Decorators verwendet werden, um Änderungen an einer Funktion hervorzurufen.
In Python können wir Funktionen als Argumente an andere Funktionen übergeben und zurückgeben. Ein Dekorateur kann auch eine Funktion als Argument akzeptieren und mit diesem Begriff Ergebnisse zurückgeben.
Das folgende Beispiel zeigt parametrisierte Decorators. Um es leichter zu verstehen, stellen Sie sich Funktionen als reale Objekte vor.
Implementieren Sie einen parametrisierten Decorator in Python
Wir werden ein Bäckereibeispiel präsentieren, um zu verstehen, wie Dekorateure andere Funktionen als parametrisierte Argumente verwenden können.
Hier ist die Bäckerei
eine parametrisierte Methode, die eine Objektfunktion obj_func()
als Parameter nimmt. Innerhalb dieser Methode wird eine verschachtelte Funktion inner()
deklariert, die Teig
ausgibt.
Danach wird obj_func()
aufgerufen und gibt die Funktion inner()
zurück. Der Aufruf der Objektfunktion ruft die dekorierte Funktion auf.
Wie Sie genau beobachten können, ist die Bäckerei
eine parametrisierte Methode, die das Argument obj_func()
nimmt, das nichts anderes als die Funktion Weizen()
ist, und es aufruft, nachdem die Funktion inner()
die Funktion drucken
Erklärung.
Code:
def inner():
print("Dough")
obj_func()
return inner
Diese zu dekorierende Funktion, also Weizen
, hat eine print
-Aussage: In Brot verwandelt
.
Code:
def wheat():
print("Turned into bread")
Eine neue Objektfunktion final
wird erstellt, die die dekorierte Funktion speichert.
Die Syntax object_function = decorator(decorated_function)
schmückt die Funktion wheat()
, indem sie sie als Objekt an die parametrisierte Methode bakery
übergibt, die ihr die Eigenschaften der Funktion inner()
implementiert.
Code:
final = bakery(wheat)
final()
Die dekorierte Funktion wird im Objekt function final
gespeichert. Beim Kompilieren führt das Programm zuerst die Funktion inner()
aus und ruft dann obj_func()
auf, die die Objektfunktion wheat()
übergibt und ihren Inhalt ausgibt.
Grob gesagt wird Weizen in einer Bäckerei zu Brot verarbeitet und das Ergebnis aufgedruckt: In Brot verwandelt
. So wie eine Bäckerei in der realen Welt funktioniert!
Code:
def bakery(obj_func):
def inner():
print("Dough")
obj_func()
return inner
def wheat():
print("Turned into bread")
final = bakery(wheat)
final()
Ausgang:
"C:\Users\Win 10\main.py"
Dough
Turned into bread
Process finished with exit code 0
Implementieren Sie Decorator mit @
in Python
Dieses Segment zeigt, wie eine Funktion mit der Syntax @function_name
dekoriert werden kann. In diesem Beispiel wird ein Programm verwendet, das Folgendes aufweist:
- Eine parametrisierte verschachtelte Funktion;
- Eine innere Funktion, die die Werte zwischen den Variablen x und y prüft und vertauscht, wenn der Zähler kleiner als der Nenner ist;
- Eine dritte Funktion, die mit den vertauschten Werten dekoriert wird, dividiert die beiden Zahlen und gibt sie aus.
Die Decorator-Funktion decor_func
nimmt als Parameter eine Objektfunktion obj1
entgegen. Darin wird die innere Funktion erstellt, die Werte vertauscht, wenn im Nennerfeld eine größere Zahl angegeben wird.
Code:
def decor_func(obj1):
def swap(x, y):
pass
Da die Parameter der inneren Funktion swap
die gleichen sind wie die Parameter der Funktion quot
, werden die in obj1
gespeicherten ausgetauschten Werte von der inneren Funktion zurückgegeben, wobei die geänderten Werte an die Funktion quot
übergeben werden, bevor der Compiler sie ausführt.
Die Syntax @decor_func
ist im Beispiel über der Funktion quot
deklariert. Es weist den Compiler an, die Parameter der Funktion obj1
zu nehmen und sie an die Funktion quot
zu übergeben.
Code:
def decor_func(obj1):
def swap(x, y):
if x < y:
temp = x
x = x + y - x
y = y + temp - y
return obj1(x, y)
return swap
# Syntax to Decorate function
@decor_func
def quot(x, y): # Displays quotient of variable x/y
print(x / y)
quot(2, 4)
Ausgang:
"C:\Users\Win 10\main.py"
2.0
Process finished with exit code 0
Implementieren Sie mehrere Decorators in Python
Das Verketten von Dekoratoren ist eine Technik, Dekoratoren übereinander zu stapeln, sodass die Zielfunktion so oft dekoriert wird, wie oft @function_name
deklariert wird.
Im folgenden Programm werden zwei Funktionen erstellt, decor
und decor1
. Diese Funktionen sind Dekoratoren und haben eine innere Funktion, die arithmetische Operationen ausführt und das Ergebnis zurückgibt.
Um Dekoratoren zu verketten, müssen diese zusammen (übereinander) oberhalb der zu dekorierenden Funktion definiert werden. Es muss auch beachtet werden, dass der Compiler Dekoratoren von unten nach oben liest.
Das bedeutet, dass der direkt über dem Funktionsnamen platzierte Dekorator zuerst implementiert wird und die anderen Dekoratoren danach nach oben implementiert werden.
Code:
@decor # Gets implemented second
@decor1 # Gets implemented first
def num():
return 5
Im folgenden Beispiel gibt die Funktion num()
einen Wert seriell an die Decorator-Funktionen zurück. Zuerst nimmt decor1
den Wert, übergibt ihn an die Objektfunktion func()
und gibt den geänderten Wert an num()
zurück.
In ähnlicher Weise wird dieser Vorgang mit der anderen Decorator-Funktion wiederholt. Wenn schließlich num()
ausgegeben wird, wird 50
als Ausgabe ausgegeben.
Code:
# code for testing decorator chaining
def decor1(func):
def inner():
x = func()
return x * x
return inner
def decor(func):
def inner():
x = func()
return 2 * x
return inner
@decor
@decor1
def num():
return 5
print(num())
Ausgang:
"C:\Users\Win 10\main.py"
50
Process finished with exit code 0
Abschluss
Dieser Artikel vermittelte dem Leser ein klares Bild davon, wie Dekorateure in einem Programm verwendet werden. Der Leser sollte lernen, wie Decorators für eine Funktion verwendet werden können, wie einem Decorator Parameter bereitgestellt werden können und wie mehrere Decorators verkettet werden.