在python中导入麻烦

时间:2012-09-24 20:51:49

标签: python python-3.x

想象一下以下项目结构

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 合并到单个文件中的情况下正确导入

1 个答案:

答案 0 :(得分:5)

Python不支持循环导入,部分原因是它们通常是设计缺陷的症状。

您可以做的是让AB自包含并从第三个文件引用它们,或者将共享结构提取到第三个文件中并从两个模块中引用它们。这究竟是如何起作用的,取决于AB是什么以及为什么你认为他们应该相互了解。

例如,您可以让A通过其构造函数引用B的实例,这样您就不需要导入了:

class A(object):
    def __init__(self, b):
        self.b = b
    # .. some methods that reference self.b

如果涉及继承,它会变得有点复杂。在这种情况下,您可能不希望超类知道子类,因为这会违反substitution principle