Python将来自不同模块的一个模块中的对象导入到第三个模块中

时间:2012-04-07 10:59:56

标签: python import

我正在阅读python项目的sourcode并遇到以下行:

from couchexport.export import Format

(来源:https://github.com/wbnigeria/couchexport/blob/master/couchexport/views.py#L1

我转到couchexport/export.py看看Format是什么(Class?Dict?还有其他什么?)。不幸的是Format不在该文件中。但是,export.py会从couchexport.models中导入Format,其中 一个Format类(来源:https://github.com/wbnigeria/couchexport/blob/master/couchexport/models.py#L11)。

当我在IDE中打开原始文件并让它查找声明时,在本问题开头提到的行中,它直接导致models.py。

发生了什么事?如何从一个文件(export.py)导入实际上是从另一个文件(models.py)导入而未明确说明?

1 个答案:

答案 0 :(得分:17)

如果模块a执行了from b import Foo,则Foo之后成为a的成员,并且可以a.Foo访问。现在只能使用from a import Foo进行导入。

如果您有一个跨多个文件分布的大型库,并且您希望可以从一个位置访问它们,则通常会使用此方法。假设您有一个包foo,其布局如下:

foo/
    a.py
    b.py
    c.py
    __init__.py

a.pyb.pyc.py分别定义了类ABC

如果你想使用这些课程,你通常必须写

from foo.a import A
from foo.b import B
from foo.c import C

这至少有两个问题:

  1. 这个简单的导入需要很多代码(三行)
  2. 之后,库作者现在不再能够更改文件/类关联,因为这会破坏现有代码。
  3. 通常你只需将以下内容放在__init__.py

    from a import A
    from b import B
    from c import C
    

    现在,您将所有部分放在一个地方,并且只需一次导入即可访问所有类:

    from foo import A,B,C