长答案:从python文档的5.4.2节:
当使用任何机制(例如importlib API,import或import-from语句或内置 ())加载子模块时,在父模块的名称空间中将绑定到子模块对象。例如,如果包spam具有子模块foo,则在导入spam.foo之后,spam将具有绑定到子模块的属性foo。假设您具有以下目录结构:
spam/
__init__.py
foo.py
bar.py
spam / .py中包含以下几行:
from .foo import Foo
from .bar import Bar
然后执行以下命令,将名称绑定绑定到垃圾邮件模块中的foo和bar:
>>>
>>> import spam
>>> spam.foo
<module 'spam.foo' from '/tmp/imports/spam/foo.py'>
>>> spam.bar
<module 'spam.bar' from '/tmp/imports/spam/bar.py'>
鉴于Python熟悉的名称绑定规则,这似乎令人惊讶,但这实际上是导入系统的基本功能。不变的假设是,如果您拥有sys.modules [‘spam’]和sys.modules [‘spam.foo’](就像在上述导入之后一样),则后者必须显示为前者的foo属性。