python的每个模块的包中,都有一个init.py文件,有了这个文件,我们才能导入这个目录下的module。
其实,init.py里面是可以有内容的,我们在导入一个包时,实际上导入了它的init.py文件。
我们可以在init.py文件中再导入其他的包,或者模块。
Package1/ __init__.py Module1.py Module2.py Package2/ __init__.py Module1.py Module2.py
我们可以就这样导入一个包:
from Package1 import Module1
from Package1 import Package2
import Packag1.Module1
import Packag1.Package2
init.py 控制着包的导入行为。如果 init.py 为空,那么仅仅导入包是什么都做不了的。
>>> import Package1
>>> Package1.Module1
Traceback (most recent call last):
File "<pyshell#1>", line 1, in ?
Package1.Module1AttributeError: 'module' object has no attribute 'Module1'
我们需要在 init.py 里把 Module1 预先导入:
#文件 __init__.py
import Module1
>>> import Package1
>>> Package1.Module1
<module 'Package1.Module1' from 'Module.pyc'>
init.py 中还有一个重要的变量,叫做 all。全部导入
from PackageName import *
这时 import 就会把注册在包 init.py 文件中 all 列表中的子模块和子包导入到当前作用域中来。
比如:
#文件 __init__.py
__all__ = ['Module1', 'Module2', 'Package2']
测试:
>>> from Package1 import *
>>>> Module2<module 'Package1.Module2' from 'Module.pyc'>
init.py 文件会在导入时被执行。