2016-08-16 2 views
0

Это выглядит просто, но я не смог найти решение.Внешние классы Python

Я показываю проблему ниже с простейшим примером, который я мог бы придумать.

(Мои классы тихи более сложный;))

файл 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) 

файл B.py не совпадают с импортируют

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

с import A -> обратного вызова: не может найти _A

Он работает только тогда, когда я -

from A import * 

Но и логически функции выполняются 2 раза.

Спасибо всем

+0

Его так как импорт A не импортирует подчеркнутые классы. Вы вызываете 'A._A' вместо' _A', когда вы делаете 'from A import _A', что позволяет вам напрямую называть' _A'. Никогда не используйте 'from A import *', всегда используйте 'import A' или' from A import _A'. Тебе не нужны оба, один будет делать. [Импорт подвешенных классов] (http://stackoverflow.com/questions/551038/private-implementation-class-in-python). [Импорт против импорта] (http://stackoverflow.com/questions/710551/import-module-or-from-module-import) –

ответ

0

Там нет необходимости в первом import X, то from X import Y. Если вам нужен Y (даже если Y - *) сделать только from X import Y. Это может быть причиной 2-кратного выполнения.

Также почему существуют циклические зависимости между модулями A -> B, B -> A? Может быть, они должны быть в одном файле?

0

Из-за циклической зависимости вы столкнулись ошибки импорта, вы можете продолжать свою работу, как:

Файл 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 

Кроме того, вы должны использовать либо import A или from A import _A и если вы используете более поздний, вы должны вызвать класс непосредственно как: _A(self.someVars) не как: A._A(self.someVars), это соглашение о вызове будет использоваться для прежнего стиля импорта (import A), для лучшего понимания внешнего использования классов и модуля вы можете указать er по ссылке: https://docs.python.org/3/tutorial/modules.html

Смежные вопросы