如何打破Python中的导入循环
我遇到了一个问题,有两个相关的大型 Python 类,所以我把它们放在了不同的文件里。假设这两个类分别叫做 Cobra 和 Rat。
现在我需要在 Cobra 的方法中调用 Rat 的方法,同时也需要在 Rat 的方法中调用 Cobra 的方法。
为此,我需要在 Rat.py 文件中导入 Cobra,而在 Cobra.py 文件中导入 Rat。
这样做就会产生一个导入循环,导致错误。因为不能在 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 个回答
44
如果你在Rat
类的定义中没有使用Cobra
,或者反过来(也就是说,只在方法内部使用),那么你其实可以把导入语句放到文件的底部,这样在那时类的定义已经存在了。
# Cobra.py
class Cobra:
# ...
def check_prey(self, rat):
# some logic
rat.foo()
import Rat
# Rat.py
import Cobra
class Rat:
# ...
def check_predator(self, snake):
# some_logic ..
snake.foo()
或者你可以限制导入的范围:
# Cobra.py
class Cobra:
# ...
def check_prey(self, rat):
import Rat
# some logic
rat.foo()
# Rat.py
import Cobra
class Rat:
# ...
def check_predator(self, snake):
# some_logic ..
snake.foo()
如果你没有直接使用Rat
和Cobra
这两个类名,那么你甚至根本不需要导入语句:只要rat
或snake
实例中有这些属性和函数,Python就不在乎它们来自哪个类。
一般来说,没有绝对可靠的方法来避免import
循环。你能做的最好的就是重构你的代码,并做一些我上面提到的事情。