„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie können Sie klassenähnliches Verhalten in Python-Modulen nachahmen?

Wie können Sie klassenähnliches Verhalten in Python-Modulen nachahmen?

Veröffentlicht am 16.11.2024
Durchsuche:415

How Can You Mimic Class-Like Behavior in Python Modules?

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:

  • Python sucht nur nach solchen Methoden für Klassen.
  • Das Ändern des zugrunde liegenden Modultyps (Modul), um die Einstellung von Attributen zu ermöglichen, ist nicht möglich.

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.

Neuestes Tutorial Mehr>

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