Heim >Backend-Entwicklung >Python-Tutorial >Wie können Sie klassenähnliches Verhalten in Python-Modulen nachahmen?
Klassenähnliches Verhalten in Modulen mit getattr dynamisch implementieren
In manchen 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 weitere 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 demonstriert diesen Ansatz:
<code class="python"># module foo.py import sys class Foo: def funct1(self, *args): <code block> def funct2(self, *args): <code block> sys.modules[__name__] = Foo()</code>
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.
Das obige ist der detaillierte Inhalt vonWie können Sie klassenähnliches Verhalten in Python-Modulen nachahmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!