在python中导入麻烦

ato*_*era 4 python python-3.x

想象一下以下项目结构

app/
    foo/
        __init__.py
        a.py
        b.py
Run Code Online (Sandbox Code Playgroud)

a.py我有类至极使用类b.py文件,和从类b.py使用类形式a.py

如果我写:

from foo.b import B 
Run Code Online (Sandbox Code Playgroud)

a.py

from foo.a import A
Run Code Online (Sandbox Code Playgroud)

b.py中,发生递归

如何在不将AB合并到单个文件中的情况下正确导入

Nik*_* B. 5

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

你可以做的是制作AB自包含,并从第三个文件中引用它们,或者,将共享结构提取到第三个文件中,并从两个模块中引用它们.究竟这是去工作的高度取决于什么A以及B是,为什么你认为他们应该互相认识的.

例如,你可以通过它的构造函数A来引用一个实例B,这样你就不需要导入了:

class A(object):
    def __init__(self, b):
        self.b = b
    # .. some methods that reference self.b
Run Code Online (Sandbox Code Playgroud)

如果涉及继承,它会变得更复杂一些.在这种情况下,您可能不希望超类知道子类,因为这会违反替换原则.

  • @atom:你应该阅读[抽象工厂模式](http://en.wikipedia.org/wiki/Abstract_factory_pattern),它可以用来避免这种紧密耦合.我在你的描述中没有看到为什么`DbAuthor`需要创建`DbPost`的引用,所以它不需要导入`DbPost`.但一般来说,你不应该通过调用构造函数来创建数据对象的实例!您应该有一个专用的数据存储对象,它充当创建对象的工厂(或从数据库中获取它们并创建包装器).只需看看sqlalchemy或其他ORM系统 (2认同)