Как прерывать цикл импорта в python

У меня есть ситуация, когда есть два связанных больших класса python и, следовательно, я поместил их в отдельные файлы. Пусть говорят, что классы - это Cobra и Rat.

Теперь нужно вызвать методы Rat из методов Cobra и наоборот. Для этого мне нужно импортировать Cobra в Rat.py и Rat в Cobra.py

Это создает цикл импорта и дает ошибку. Не могу импортировать Cobra внутри Cobra.

Как это исправить?

Cobra.py

import Rat
class Cobra():
    def check_prey(self, rat ):
        # Some logic 
        rat.foo()

Rat.py

import Cobra
class Rat():
    def check_predator(self, snake ):
        # some_logic ..
        snake.foo()

Ответ 1

Если вы не используете Cobra в определении класса Rat или наоборот (т.е. Используются только внутри методов), то вы можете фактически переместить оператор импорта в конец файла, к этому времени определение класса уже будет существовать.

Class Cobra:
...
def check_prey(self, rat ):
    Some logic rat.foo()

import Rat


import Cobra
class Rat
...
def check_predator(self, snake ):
   some_logic ..
   snake.foo()

Или вы также можете ограничить объем импорта

Class Cobra:
...
def check_prey(self, rat ):
    import Rat
    Some logic rat.foo()

import Cobra
class Rat
...
def check_predator(self, snake ):
   some_logic ..
   snake.foo()

Если вы не используете имена классов Rat и Cobra напрямую, вам даже не нужны операторы import: пока свойства и функции существуют в экземплярах rat или snake, python не заботится, к какому классу они относятся. Вы из.

В общем, нет надежного способа избежать петель импорта. Лучшее, что вы можете сделать, - это рефакторинг вашего кода и выполнение некоторых вещей, которые я упомянул выше.