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()
你能解释为什么写第一个版本的import语句是错误的吗?我更喜欢完全限定的名称,例如lin.factory.AClass
到factory.AClass
。
答案 0 :(得分:4)
这是因为,除非您在lin
中告诉factory
导入__init__.py
,否则factory
不在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
中使用它,则需要在{{1}}中定义工厂。