Круговой импорт Python - PullRequest
0 голосов
/ 06 мая 2018

У меня проблема с кодом Python 3.6 в отношении циклического импорта.

У меня есть базовый класс, называемый Cereal, и 4 класса, которые наследуют его (Cereal1, Cereal2, ...). Каждый - это отдельный файл. Например:

File1:

class Cereal:

File2:

class Cereal1(Cereal):

И так далее. Когда я создаю кашу:

x = Cereal(K1,K2) 

в зависимости от значений K1 и K2, функция внутри конструктора распознает, какой это тип зерна и меняет класс зерна:

def __init__(self, K1, K2):
    self.findcerealtype(K1, K2)

def findcerealtype(self, K1, K2):
    if K1 < 0:
        self.__class__ = Cereal1
        self = Cereal1(K1, K2)
    elif K1 == 0:
        self.__class__  = Cereal2
        self = Cereal2(K1, K2)
    else:
        if K2 < 1:
            self.__class__  = Cereal3
            self = Cereal3(K1, K2)
        else:
            self.__class__  = Cereal4
            self = Cereal4(K1, K2)

Ну, проблема возникает, когда я импортирую файлы следующим образом:

File1:

from File2 import Cereal1
from File3 import Cereal2
from File4 import Cereal3
from File5 import Cereal4

class Cereal:
    def __init__(self,K1,K2):
        findcerealtype(self,K1,K2)

    def findcerealtype(self, K1, K2):
    .
    .
    .and other functions

File2:

from File1 import Cereal

class Cereal1(Cereal):
    def __init__(self, K1, K2):
    .
    .
    .and other functions

Когда я запускаю код, я получаю следующую ошибку:

ImportError: cannot import name 'Cereal'

Из того, что я прочитал, я думаю, что проблема заключается в круговом импорте. Я пробовал разные варианты импорта (то есть import File1) и позднее импортировать файлы в коде, но ни один из них, похоже, не работает.

Я также читал, что циклический импорт не должен происходить, и проблема в том, как мой код структурирован. В этом случае я открыт для предложений о том, как переписать код, но я не знаю, как это сделать самостоятельно.

Если вам удалось прочитать до конца, большое спасибо, и я надеюсь, что вы мне поможете!

...