Heim >Backend-Entwicklung >Python-Tutorial >Wie implementiert man die getattr-Funktionalität für Module in Python?

Wie implementiert man die getattr-Funktionalität für Module in Python?

DDD
DDDOriginal
2024-10-29 20:48:03362Durchsuche

How to Implement getattr Functionality for Modules in Python?

So implementieren Sie getattr in einem Modul

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.

Implementierungsversuche und Herausforderungen

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:

  1. xxx Methoden werden ausschließlich in der Klasse nachgeschlagen.
  2. TypeError: can Es werden keine Attribute des integrierten/Erweiterungstyps „Modul“ festgelegt

Mögliche Lösungen

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:

  • Alle anderen Modulattribute gehen nach dem Austausch verloren.
  • Für den Modulimport * müssen alle in definiert sein die Klasse zur Unterstützung von Wildcard-Importen.

Fazit

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn