Heim >Backend-Entwicklung >Python-Tutorial >Python-Dekoratoren verstehen: Ein tiefer Einblick

Python-Dekoratoren verstehen: Ein tiefer Einblick

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 08:22:28446Durchsuche

Python-Dekoratoren sind leistungsstarke Werkzeuge, mit denen wir das Verhalten von Funktionen oder Methoden ändern oder verbessern können. Zu den häufigsten Anwendungsfällen gehören Protokollierung, Autorisierung und mehr.
Wenn man jedoch darum bittet, einen Dekorateur zu definieren, sagen viele vielleicht:

Es ist ein Wrapper für eine Funktion.

Obwohl dies technisch korrekt ist, passiert unter der Haube noch viel mehr.

Analyse eines einfachen Dekorateurs
Sehen wir uns ein einfaches Beispiel an:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before calling the function")
        result = func(*args, **kwargs)
        print("After calling the function")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

Hier ist my_decorator ein Dekorator für die Funktion say_hello. Wenn say_hello definiert ist, wird es automatisch an my_decorator übergeben und wandelt den Funktionsaufruf in Folgendes um:
say_hello = my_decorator(say_hello)

Wann findet diese Transformation statt?
Diese Transformation erfolgt während der Kompilierung des Codes, insbesondere zum Zeitpunkt der Funktionsdefinition – nicht zum Zeitpunkt der Ausführung.

Den Code zerlegen
Um zu verstehen, wie Dekoratoren auf einer niedrigeren Ebene arbeiten, können wir das Modul dis verwenden, um den Bytecode der dekorierten Funktion zu untersuchen:

import dis

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

dis.dis(say_hello)

Bytecode-Aufschlüsselung

Die Ausgabe von dis.dis(say_hello) könnte so aussehen:

Understanding Python Decorators: A Deep Dive
Erklärung des Bytecodes

  1. Vor dem Aufruf der Funktion

    • LOAD_GLOBAL: Lädt die Druckfunktion.
    • LOAD_CONST: Lädt die Nachricht „Vor dem Aufruf der Funktion“.
    • CALL_FUNCTION: Ruft Druck auf.
    • POP_TOP: Verwirft den Rückgabewert.
  2. Aufrufen der Originalfunktion

    • LOAD_DEREF: Lädt die ursprüngliche Funktion (func), die vom Abschluss erfasst wird.
    • LOAD_FAST: Lädt die Positions- und Schlüsselwortargumente.
    • BUILD_MAP: Erstellt ein neues Wörterbuch für Schlüsselwortargumente.
    • CALL_FUNCTION_EX: Ruft die ursprüngliche Funktion mit den Argumenten auf.
    • STORE_FAST: Speichert das Ergebnis in einer lokalen Variablen.
  3. Nach dem Aufruf der Funktion

    • Ähnlich wie im ersten Teil wird print aufgerufen, um „Nach Aufruf der Funktion“ auszugeben.
    • Rückgabe des Ergebnisses
    • Ladet die Ergebnisvariable und gibt sie zurück.

Fazit
Python-Dekoratoren sind mehr als nur Funktions-Wrapper. Sie ermöglichen es uns, das Funktionsverhalten zum Zeitpunkt der Definition zu ändern. Indem wir verstehen, wie sie funktionieren, und den Bytecode untersuchen, können wir Dekoratoren in unseren Projekten effektiver einsetzen.

Das war's vorerst! Wenn Sie möchten, dass ich mich noch mit anderen Dingen befasse, lassen Sie es mich einfach wissen!

Das obige ist der detaillierte Inhalt vonPython-Dekoratoren verstehen: Ein tiefer Einblick. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn