Dynamisches Implementieren von klassenähnlichem Verhalten in Modulen mithilfe von getattr
In einigen Szenarien kann es wünschenswert sein, es nachzuahmen das Verhalten von __getattr__ für eine Klasse, aber für ein gesamtes Modul. Dies ermöglicht die dynamische Erstellung von Klasseninstanzen und den Aufruf ihrer Methoden basierend auf Attributsuchen im Modul.
Der Versuch, eine __getattr__-Methode direkt in einem Modul zu definieren, stößt jedoch auf zwei Hindernisse:
Wrapper-basierte Lösung
Ein Ansatz besteht darin, einen Wrapper um das Modul zu erstellen. Sys.modules ist gegenüber verschiedenen Objekttypen tolerant, sodass wir das Modul in eine Klasse einschließen und es sys.modules[__name__] zuweisen können. Dies ermöglicht dynamisches Verhalten, ohne das Modul selbst zu verändern. Diese Technik gilt jedoch nur für den Zugriff auf Modulebene.
Guido van Rossums Hack
Eine andere von Guido van Rossum vorgeschlagene Lösung besteht darin, das eigentliche Modul in sys zu ersetzen. Module mit einer Instanz einer innerhalb des Moduls definierten Klasse. Die Importmaschinerie führt diesen letzten Substitutionsschritt durch und ermöglicht so diesen Hack. Das folgende Beispiel veranschaulicht diesen Ansatz:
# module foo.py
import sys
class Foo:
def funct1(self, *args):
def funct2(self, *args):
sys.modules[__name__] = Foo()
Jetzt kann über die Instanz von Foo auf die im Modul definierten Funktionen zugegriffen werden.
Überlegungen
Bei Verwendung dieser Techniken kann es sein, dass auf andere Modulelemente nach der sys.modules-Zuweisung nicht mehr zugegriffen werden kann. Definieren Sie alle erforderlichen Funktionen innerhalb der Ersatzklasse, um den Verlust von Modulinhalten zu vermeiden.
__all__ Attribut
Wenn Sie from module import * verwenden, definieren Sie __all__ in der Ersatzklasse, um dies zu handhaben Art der Importanweisung. Lassen Sie Attribute wie __module__ und __qualname__ aus __all__ weg.
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