想象一下以下项目结构
app/
foo/
__init__.py
a.py
b.py
在 a.py 中,我有一个 A 类,它使用 b.py 文件中的 B 类, b.py 中的 B 类使用 A 类表单 a.py
如果我写:
from foo.b import B
a.py 和中的
from foo.a import A
b.py 中的,发生递归
如何在不将 A 和 B 合并到单个文件中的情况下正确导入
答案 0 :(得分:5)
Python不支持循环导入,部分原因是它们通常是设计缺陷的症状。
您可以做的是让A
和B
自包含并从第三个文件引用它们,或者将共享结构提取到第三个文件中并从两个模块中引用它们。这究竟是如何起作用的,取决于A
和B
是什么以及为什么你认为他们应该相互了解。
例如,您可以让A
通过其构造函数引用B
的实例,这样您就不需要导入了:
class A(object):
def __init__(self, b):
self.b = b
# .. some methods that reference self.b
如果涉及继承,它会变得有点复杂。在这种情况下,您可能不希望超类知道子类,因为这会违反substitution principle。