2016-08-16 1 views
0

Es sieht einfach aus, aber ich konnte keine Lösung finden.Python Externe Klassen

Ich zeige das Problem unten mit dem einfachsten Beispiel, das ich mir vorstellen konnte.

(Meine Klassen ruhig sind komplexer;))

Datei A.py

import os, sys 
import B 
from B import * 
class _A(): 
    def __init__(self,someVars): 
     self.someVars = someVars 
    def run(self): 
     print self.someVars 

someVars = 'jdoe' 
B._B(someVars) 

Datei B.py mit dem Import nicht

A entsprechen
import A 
from A import _A 
class _B(): 
    def __init__(self,someVars): 
     self.someVars = someVars 
    def run(self): 
     A._A(self.someVars) 

mit import A -> Rückruf: nicht finden können, _A

Es funktioniert nur, wenn ich -

from A import * 

Aber und logisch sind A-Funktionen 2-mal ausgeführt.

Vielen Dank an alle

+0

Da Import A keine unterstrichenen Klassen importiert. Sie rufen 'A._A' anstelle von' _A' auf, wenn Sie 'von A import_A' verwenden und direkt '_A' aufrufen können. Verwenden Sie niemals 'from A import *', immer entweder 'import A' oder' from A import _A'. Du brauchst beides auch nicht, man wird es tun. [Unterklassierte Klassenimporte] (http://stackoverflow.com/questions/551038/private-implementation-class-in-python). [Import vs. vom Import] (http://stackoverflow.com/questions/710551/import-module-or-from-module-import) –

Antwort

0

Es gibt keine Notwendigkeit, zuerst import X, dann from X import Y. Wenn Sie Y benötigen (auch wenn Y* ist), tun Sie einfach from X import Y. Dies könnte die Ursache der 2-maligen Ausführung sein.

Warum haben auch zyklische Abhängigkeiten zwischen Modulen A -> B, B -> A? Vielleicht sollten sie dann in einer Datei sein?

0

Durch zyklische Abhängigkeit der Import Fehler konfrontiert sind, können Sie Ihre Arbeit als weiter:

Datei A.py:

import os, sys 
#Below two import lines does cyclic dependency between file A and B which is wrong and will give import error, 
#commenting below two lines will resolve your import error 
#import B 
#from B import * 
class _A(): 
    def __init__(self,someVars): 
     self.someVars = someVars 
    def run(self): 
     print self.someVars 

someVars = 'jdoe' 
#B._B(someVars) #comment and respective logic should be moved in B file 

Außerdem sollten Sie entweder import A oder from A import _A und Wenn Sie den späteren verwenden, sollten Sie die Klasse direkt als: _A(self.someVars) nicht als: A._A(self.someVars) anrufen, wird diese Aufrufkonvention für den früheren Import-Stil verwendet (import A), zum besseren Verständnis der externen Verwendung von Klassen und Modul, können Sie ref er folgenden Link: https://docs.python.org/3/tutorial/modules.html