如何在python中打破导入循环

Tiw*_*ari 23 python

我有一个情况,有两个相关的大型python类,因此我把它们放在单独的文件中.让我们说课程是Cobra和Rat.

现在需要从Cobra的方法调用Rat的方法,反之亦然.为此,我需要在Cobra.py中输入Rat.py和Rat中的Cobra

这会创建一个导入循环并产生错误.不能在眼镜蛇内部进口眼镜蛇.

怎么解决这个?

Cobra.py:

import Rat
class Cobra():
    def check_prey(self, rat ):
        # Some logic 
        rat.foo()
Run Code Online (Sandbox Code Playgroud)

Rat.py:

import Cobra
class Rat():
    def check_predator(self, snake ):
        # some_logic ..
        snake.foo()
Run Code Online (Sandbox Code Playgroud)

Cha*_* Ma 32

如果您不在Rat的类定义中使用Cobra,反之亦然,即仅在内部方法中使用,那么您实际上可以将import语句移动到文件的底部,此时类定义已经存在.

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()
Run Code Online (Sandbox Code Playgroud)

或者您也可以限制导入的范围

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()
Run Code Online (Sandbox Code Playgroud)

如果你不直接使用Rat和Cobra类名,那么你甚至根本不需要import语句,只要rat或stake实例中存在属性和函数,python不关心它们是什么类来自.

一般来说,没有完全证明避免导入循环的方法,你可以做的最好是重构你的代码并做一些我上面提到的事情.