In Python können Objekte dynamische Attribute haben, die nicht in ihrer Klassendefinition definiert sind. Dieses dynamische Verhalten wird durch die Methode getattr erreicht, die aufgerufen wird, wenn eine Attributsuche für ein Objekt fehlschlägt. Leider unterstützen Module __getattr__ nicht von Natur aus.
Das Ziel besteht darin, die getattr-Funktionalität auf einem Modul nachzuahmen, sodass, wenn ein Attribut nicht gefunden wird, eine Instanz einer vordefinierten Klasse mit erstellt wird Derselbe Name und die Methode mit diesem Namen wird in dieser Instanz aufgerufen.
Es wurde versucht, getattr wie folgt in einem Modul zu implementieren:
<code class="python">class A(object): def salutation(self, accusative): print "hello", accusative # intentionally on the module, not the class def __getattr__(mod, name): return getattr(A(), name) if __name__ == "__main__": salutation("world") # hoping for __getattr__ to be invoked</code>
Dieser Ansatz stößt jedoch auf zwei Hindernisse:
Wrapper-Methode:
Die sys.modules Das Wörterbuch ist flexibel und ermöglicht die Erstellung eines Wrappers, der den Modulzugriff abfängt. Dies unterstützt jedoch nur Zugriffsmethoden über das Modul, nicht innerhalb des Moduls selbst. Darüber hinaus kann das Erstellen einer neuen Instanz jedes Mal zu einem anderen Verhalten als beim globalen Ansatz führen.
Klassenaustausch:
Wie von Guido van Rossum empfohlen, ein hackiger Ansatz beinhaltet das Erstellen einer Klasse und das Ersetzen von sys.modules[__name__] durch eine Instanz dieser Klasse. Dies ermöglicht die Verwendung von __getattr__/__setattr__/__getattribute__. Es gibt jedoch Einschränkungen:
Während Python-Module __getattr__ nicht nativ unterstützen, bieten die vorgeschlagenen Lösungen Problemumgehungen, um eine ähnliche dynamische Attributauflösung für Module zu erreichen.
Das obige ist der detaillierte Inhalt vonWie implementiert man die getattr-Funktionalität für Module in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!