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:
Erklärung des Bytecodes
Vor dem Aufruf der Funktion
Aufrufen der ursprünglichen Funktion
Nach Aufruf der Funktion
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!
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