„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Python-Dekoratoren verstehen: Ein tiefer Einblick

Python-Dekoratoren verstehen: Ein tiefer Einblick

Veröffentlicht am 08.11.2024
Durchsuche:301

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 Dekorator zu definieren, könnten viele sagen:

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 print auf.
    • POP_TOP: Verwirft den Rückgabewert.
  2. Aufrufen der ursprünglichen Funktion

    • 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 Aufruf der Funktion

    • Ähnlich wie im ersten Teil wird print aufgerufen, um „Nach Aufruf der Funktion“ auszugeben.
    • Ergebnis zurückgeben
    • Lädt die Ergebnisvariable und gibt sie zurück.

Abschluss
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 fürs Erste! Wenn Sie möchten, dass ich mich noch mit anderen Dingen befasse, lassen Sie es mich einfach wissen!

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/aman-giri/understanding-python-decorators-a-deep-dive-pp0?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3