2

Python 的导入功能有时仍然让我感到困惑。这是一个例子:

我的项目具有以下包结构:

Project/
    src/
        example/
            __init__.py
            an_example.py
        top/
            __init__.py
            lin/
                __init__.py
                factory.py

an_example.py,我想写

from top import lin
if __name__ == '__main__':
    a = lin.factory.AClass()

但是,这失败了:

    a = lin.factory.AClass()
AttributeError: 'module' object has no attribute 'factory'

an_example.py像这样写的时候工作:

from top.lin import factory
if __name__ == '__main__':
    a = factory.AClass()

你能解释一下为什么像第一个版本那样写导入语句是错误的吗?我更喜欢一个完全限定的名称lin.factory.AClass,例如factory.AClass.

4

1 回答 1

4

这是因为,除非您告诉linimport factoryin __init__.py,否则 thenfactory不在lin命名空间中。

例如:

假设您现有的项目结构,其中 an_example.py 包含:

from top import lin

lin.factory.AClass()

top/lin/__init__.py空白,我们得到ImportError: No module named factory.

使用top/lin/__init__.py包含import top.lin.factory,我们不会出错。

当您要求使用factory.AClass()时,它可以工作,因为它是在那里定义的。同样,lin如果要从那里使用工厂,则需要在其中定义工厂。

于 2012-04-26T13:22:42.853 回答