0

Я столкнулся с ситуацией, как показано ниже, где каждому классу нужен другой класс, и он создает циклическую зависимость. Я столкнулся с ситуацией этого типа, обертывая некоторый c-код, используя ctypes. В этой теме уже много сообщений, но я не нашел их полезными, мне нужен пример. Любые мысли/примеры по этому вопросу будут полезны.Как разрешить эту зависимость Circular в Python

# Module A 
from B import C2 

class C1(object): 
    def __init__(self): 
     self.name = "C1" 
     self.c2 = C2() 


# Module B 
from A import C1 

class C2(object): 
    def __init__(self): 
     self.name = "C2" 
     self.c1 = C1() 

# Main 
from A import C1 

if __name__ == "__main__": 
    o = C1() 
    print o.name 
+1

Этот код содержит бесконечную рекурсию: Параметр '__init __()' метод 'C1' безоговорочно называет' __init __() '' 'C2' и наоборот. –

+0

Возможный дубликат [Разрешить круговую ошибку импорта в python] (http://stackoverflow.com/questions/10027011/resolve-circular-import-error-in-python). Мой пример здесь в основном такой же, как и мой ответ. –

ответ

2

Изменить модуль B не следует импортировать класс C1 до последнего момента, внутри __init__.py:

class C2(object): 
    def __init__(self): 
     from A import C1 
     self.name = "C2" 
     self.c1 = C1() 

Обратите внимание, что из-за C1 конкретизирует C2 и наоборот, вы в конечном итоге с бесконечная проблема рекурсии, но я с уверенностью предполагаю, что у вас нет этой проблемы за пределами вашего примера иллюстрации.

4

Solutions (при условии, inifinite рекурсию разрешен):

  1. Избегайте такого рода круговой зависимости.

  2. Вставьте взаимозависимые компоненты в один и тот же модуль.

  3. Используйте import A и import B вместо формы from .... (Это может привести к сбою в определенных ситуациях, если пакеты задействованы.)

  4. Используйте импорт на уровне функциональности.

1

Это круговые зависимости на любом языке, на самом деле это бесконечная рекурсия

Take c2 из c1 и c1 из c2

from B import C2 
from A import C1 

class C3(object): 
    def __init__(self):   
    self.c1 = C1() 
    self.c2 = C2() 
0

Я думаю, что этот код поможет вам.

Как это ошибка кругового импорта, удалите оператор импорта из MODULE B -> "из импорта C1".

Импорт 'C1', где вам нужно (внутри метода).

Как это -

класса С2 (объект):

def __init__(self): 
    import A.C1 
    self.name = "C2" 
    self.c1 = C1()