Implementieren Sie mehrere Decorators in Python

Jay Shaw 10 Oktober 2023
  1. Implementieren Sie einen Decorator: Funktioniert als erstklassige Objekte
  2. Implementieren Sie einen parametrisierten Decorator in Python
  3. Implementieren Sie Decorator mit @ in Python
  4. Implementieren Sie mehrere Decorators in Python
  5. Abschluss
Implementieren Sie mehrere Decorators in Python

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.

Verwandter Artikel - Python Decorator