Heim >Backend-Entwicklung >Python-Tutorial >Wie können Sie klassenähnliches Verhalten in Python-Modulen nachahmen?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-29 19:04:02891Durchsuche

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

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:

  • 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 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!

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