Einfaches Kreuz import in python
Möchte ich eigenen code in die verschiedenen Klassen und stellen Sie Sie auf verschiedene Dateien. Aber diese Klasse sind voneinander abhängig.
main.py:
from lib import A, B
def main():
a = A()
b = B()
a.hello()
b.hello()
if __name__ == '__main__':
main()
lib/_init_.py:
from a import A
from b import B
lib/a.py:
import lib.B
class A():
def __init__(self):
print "A"
def hello(self):
print "hello A"
b = B()
lib/b.py:
import lib.A
class B():
def __init__(self):
print "B"
def hello(self):
print "hello B"
a = A()
Ist es möglich, dass in Python?
EDIT:
Bekomme ich diese Fehlermeldung:
pydev debugger: starting
Traceback (most recent call last):
File "eclipse-python/plugins/org.python.pydev_2.7.1.2012100913/pysrc/pydevd.py", line 1397, in <module>
debugger.run(setup['file'], None, None)
File "eclipse-python/plugins/org.python.pydev_2.7.1.2012100913/pysrc/pydevd.py", line 1090, in run
pydev_imports.execfile(file, globals, locals) #execute the script
File "main.py", line 2, in <module>
from lib import A, B
File "lib/__init__.py", line 1, in <module>
from a import A
File "lib/a.py", line 1, in <module>
import lib.B
ImportError: No module named B
- Hast du es versuchen? Was ist falsch gelaufen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt den Import der Module auf der Oberseite, importieren Sie das andere Modul in die Hallo-Funktion.
import lib
oben ein dann verwendenlib.A()
import lib as x
und die Verwendungx.A()
from lib import A
...Ihr Hauptproblem ist, dass du versuchst zu importieren, eine Klasse, aber verwendet eine syntax, die nur arbeitet, um ein Modul importieren. Insbesondere
import lib.A
ist nie zur Arbeit gehen, wennA
ist eine Klasse definiert in Modullib.a
(und importiert in die top-level-namespacelib
).Was ich vorschlagen, dass Sie vermeiden Sie die Verwendung der
from _ import _
syntax, es sei denn, Sie es wirklich brauchen. Das macht die Abhängigkeiten viel einfacher zu beheben:lib/a.py
:lib/b.py
:lib/__init__.py
:Konnte man auch mit relative-Modul importiert, wenn Sie nicht wollen
a
undb
abhängig zu sein, auf den Namen des Paketslib
.Dies ist sicher zu arbeiten, weil weder der Klasse A oder B tatsächlich erfordert das andere existieren noch, um definiert zu werden. Es ist nur, nachdem Sie importiert, die Instanzen zu wissen über die Klasse B (und Umgekehrt).
Wenn man von den Klassen geerbt von den anderen, oder anderweitig verwendet werden, eine Instanz der anderen auf der obersten Ebene, müssten Sie vorsichtiger sein über das Modul wurde geladen, bis die ersten sein, oder es könnte immer noch brechen.
Wenn Sie zwei Klassen, die voneinander abhängig in der Regel bedeutet, dass Sie entweder wirklich gehören zu der gleichen Modul, oder Sie haben eine zu enge Kopplung, die behoben werden sollten Verwendung von dependency injection.
Nun sind es ja ein paar Ecke Fällen, in denen das importieren von innerhalb der Funktion ist die "am wenigsten Schlimmste" Lösung, aber das ist noch etwas, was Sie vermeiden sollten so viel wie möglich.
Wenn Sie möchten, importieren Sie Sie nur einmal, können Sie importieren Sie Sie in den Konstruktor der Klasse und die variable global:
Wäre dies Ein import in eine Globale variable und machen es zugänglich bilden innerhalb des Moduls.