Einfacher Cross-Import in Python

7

Ich möchte Code in verschiedenen Klassen trennen und sie in verschiedene Dateien einfügen. Diese Klassen sind jedoch voneinander abhängig.

main.py:

%Vor%

lib / _ init _. py :

%Vor%

lib / a.py:

%Vor%

lib / b.py:

%Vor%

Ist das in Python möglich?

BEARBEITEN:

Ich bekomme diese Fehlermeldung:

%Vor%     
ts_pati 21.06.2013, 00:34
quelle

4 Antworten

12

Anstatt die Module oben zu importieren, könnten Sie das andere Modul in die Hello-Funktion importieren.

%Vor%     
Michael_Scharf 21.06.2013, 00:40
quelle
5

Ihr Hauptproblem besteht darin, dass Sie versuchen, eine Klasse zu importieren, aber eine Syntax verwenden, die nur zum Importieren eines Moduls verwendet wird. Insbesondere wird import lib.A niemals funktionieren, wenn A eine Klasse ist, die im Modul lib.a definiert ist (und in den Namespace der obersten Ebene von lib importiert wurde).

Ich schlage vor, dass Sie die from _ import _ -Syntax vermeiden, es sei denn, Sie benötigen sie wirklich. Das macht die Abhängigkeiten viel einfacher zu lösen:

lib/a.py :

%Vor%

lib/b.py :

%Vor%

lib/__init__.py :

%Vor%

Sie können auch relative Modulimporte verwenden, wenn a und b nicht vom Namen ihres Pakets lib abhängig sein sollen.

Das wird sicher funktionieren, weil weder die Klasse A noch B tatsächlich die Existenz der anderen erfordert, um definiert zu werden. Erst nachdem sie importiert wurden, müssen Instanzen von A über die Klasse B Bescheid wissen (und umgekehrt).

Wenn eine der Klassen von der anderen geerbt wurde oder anderweitig eine Instanz der anderen auf oberster Ebene verwendet wurde, müssen Sie vorsichtiger sein, welches Modul zuerst geladen wurde, oder es könnte immer noch brechen.

>     
Blckknght 21.06.2013 07:24
quelle
4

Wenn Sie zwei Klassen haben, die voneinander abhängen, bedeutet das normalerweise, dass sie entweder zum selben Modul gehören oder dass Sie eine zu enge Kopplung haben, die mit Hilfe der Abhängigkeitsinjektion gelöst werden sollte.

Nun gibt es in der Tat einige Fälle, bei denen das Importieren aus der Funktion die "schlechteste" Lösung ist, aber das sollten Sie so gut wie möglich vermeiden.

    
bruno desthuilliers 21.06.2013 06:08
quelle
0

Wenn Sie es nur einmal importieren möchten, können Sie es im Konstruktor der Klasse importieren und die Variable global machen:

%Vor%

Dies würde A in eine globale Variable importieren und innerhalb des Moduls zugänglich machen.

    
Michael_Scharf 21.06.2013 01:22
quelle

Tags und Links