Wie gehe ich mit zirkulären Importen in Python mit unveränderlichen und veränderlichen Klassen um?

Linda Hamilton
Freigeben: 2024-11-06 20:26:02
Original
917 Leute haben es durchsucht

How to Handle Circular Imports in Python with Immutable and Mutable Classes?

Zirkuläre Importe in Python mit unveränderlichen und veränderlichen Klassen vermeiden

Zirkuläre Importe werden normalerweise als Symptom für schlechtes Codedesign angesehen. In bestimmten Szenarien können jedoch zirkuläre Abhängigkeiten zwischen Klassen erforderlich sein. Um in solchen Fällen Importfehler zu vermeiden, müssen die Importanweisungen und die Platzierung von Zirkelverweisen sorgfältig verwaltet werden.

Beispielszenario

Betrachten Sie zwei Klassen, A und B, wobei A ein veränderliches Attribut (eine Liste) und B ein unveränderliches Attribut (ein Tupel) hat. Jede Klasse benötigt eine Methode, die eine Instanz der anderen Klasse nimmt und eine Instanz von sich selbst zurückgibt und die Attribute entsprechend transformiert.

Lösungen

Es gibt mehrere Ansätze, die es zu vermeiden gilt Zirkuläre Importe in diesem Szenario:

Absolute Importe:

Verwenden Sie in a.py und b.py absolute Importe, um sicherzustellen, dass die Module sich gegenseitig direkt importieren können:

# a.py
from package import b

# b.py
from package import a
Nach dem Login kopieren

Import zurückstellen:

Importieren der anderen Klasse verzögern, bis sie tatsächlich innerhalb einer Funktion benötigt wird:

# a.py
def convert_to_list(b_obj):
    from package import b
    return a.A(list(b_obj.immutable_attr))

# b.py
def convert_to_tuple(a_obj):
    from package import a
    return b.B(tuple(a_obj.mutable_attr))
Nach dem Login kopieren

Mittelstufe Modul:

Erstellen Sie ein Zwischenmodul, das sowohl a als auch b importiert. Dieses Modul kann dann sowohl von a als auch von b importiert werden, um zirkuläre Importe zu vermeiden:

# package/common.py
import a
import b
Nach dem Login kopieren

In a.py und b.py importieren Sie das Zwischenmodul:

# a.py
from package import common

# b.py
from package import common
Nach dem Login kopieren

Zirkelverweise in Klassendefinitionen vermeiden:

Zirkelverweise in Klassendefinitionen sollten vermieden werden. Erwägen Sie stattdessen die Erstellung einer Factory-Funktion, die die Attribute der Klasse als Argumente verwendet und eine Instanz der entsprechenden Klasse zurückgibt:

# a.py
def create_a(list_attr):
    return A(list(list_attr))

# b.py
def create_b(tuple_attr):
    return B(tuple(tuple_attr))
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie gehe ich mit zirkulären Importen in Python mit unveränderlichen und veränderlichen Klassen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!