python __init__.py
标签(空格分隔): python
package,module是python中对外发布程序的封装机制。
- package 一个含有众多python源代码文件和一个特殊的
__init__.py
文件的文件夹,package是可以嵌套的,也就是说一个package下面有可以有package- module 每个python文件其实就是一个module
__init__.py
,这个文件我们可以把他看作是一个package中的一个重要module。
__init__.py
的初衷?
既然一个package就是一个包含了python文件的目录,那么,如何判定这个文件夹就是一个package呢?
假如在当前目录有一个名叫http的空目录,假如python认为它就是http的package,那么程序就无法调用真正的http包了。
所以python规定,只有当一个目录含有__init__.py
时,才能确定该目录是一个合法的package
__init__.py
仅仅如此吗?
如果该文件仅仅是为了判定该目录是不是一个包,那么每个包目录下有一个空的且文件名为
__init__.py
不就可以了? 拿衣服呀~
python做了对该文件做了更加详细的规定,使得文件python的导入过程和该文件息息相关
__init__.py
的作用
只要被import的包,模块,符号是属于一个package的,那么这个包的__init__.py
就会在之前被import。
比如 package1/subpackage/module.py 中有一个全局变量var
import package1.subpackage.module.var
from package1/subpackage import module
这两句import语句当中,import都会先import package1的__init__.py
,然后再import subpackage的__init__.py
再说import
常见导入方式 1
from xxx import yyy
xxx:
可以是package,module
yyy:
当xxx是package时,yyy可以是module或package
当xxx是module时,yyy只能是module内的符号
常见导入方式 2
import xxx
这种方式比较简单,xxx可以是 package module symbol
常见导入方式 3
from xxx import *
如果xxx是一个package,那条语句相当于
import xxx.__init__
for i in xxx.__init__.__all__:
import i
例子:
#file : xxx.__init__
__all__= [package1, module1,symbol]
那么当执行from xxx import *,相当于
import xxx.__init__
import package1
import module1
import symbol
p.s. 如果没有定义 __all__
,那么只有__init__.py
被导入
如果xxx是一个module
在模块(*.py)中使用意为导出all列表里的类、函数、变量等成员,
否则将导出modualA中所有不以下划线开头(私有)的成员,
在模块中使用all属性可避免在相互引用时的命名冲突
reference:
https://docs.python.org/3/tutorial/modules.html#packages