file2
file1.MyClass
必须在某处导入。内部导入my_fun
当然是可能的,但不可取。from file1 import MyClass
在文件开头执行会导致循环依赖问题:可能MyClass
在那个时候还没有执行,所以可能不存在。
选项1:
import file1
def my_fun(self):
if i == 1:
new_obj = file1.MyClass(i + 1)
在这种情况下,file1
将引用正确的模块对象,即使它__dict__
当时没有完全填充。到my_fun
可以调用的时候,file1
就已经加载完毕了。
选项 2:
class MyClass():
def __init__(self, i):
print(i)
from file2 import my_fun
MyClass.my_fun = my_fun
del my_fun
def my_fun(self):
if i == 1:
new_obj = MyClass(i + 1)
from file1 import MyClass
在这个版本中,您可以在导入到另一个文件的事物的定义有机会运行之后放置所有导入语句。这一点都不优雅。
选项 3
def my_fun(self):
from file1 import MyClass
if i == 1:
new_obj = MyClass(i + 1)
这是所有选项中最丑陋的。您可以通过删除file2
对 的依赖来删除循环依赖file1
。依赖是 独占的my_fun
,直到运行时才表现出来,当它完全可解决时。这并不可怕,因为在第一次执行之后,导入基本上只是分配
MyClass = sys.modules['file1'].MyClass
TL;博士
通过仔细处理模块加载的执行路径,您有几种绕过循环依赖的方法。但是,此处显示的所有选项都是代码异味,您应该避免使用它们。它们表明应该以其他方式解决的模块之间不适当的耦合级别。