Python中的__init__.py文件作用
Python中的__init__.py文件作用
创建的__init__.py 文件都是空,今天看人源码,原来还可以这样玩。
.
├── a.py
├── package
│ ├── b.py
│ ├── __init__.py
│ └── __pycache__
-
导包的时候会优先执行init.py文件。
package/init.py
:print('执行了__ini__.py')
a.py
:from package import *
我们执行
python3 a.py
,执行结果:执行了__ini__.py
-
init.py导入了
sys
,那么在导入这个from package import *
的时候就可以直接使用sys
,简化了其他包引用package/init.py
import sys print('执行了__ini__.py')
a.py
from package import * print(sys.path)
c.py
c和a都引用了sys模块from package import * print(sys.path)
我们执行
python3 a.py
,执行结果:执行了__ini__.py ['/home/tarzan/Desktop/playw_test', '/home/tarzan/Desktop/playw_test', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/home/tarzan/.local/lib/python3.7/site-packages', '/usr/local/lib/python3.7/dist-packages', '/home/tarzan/Desktop/desktop-pro/pyat_activator', '/usr/local/lib/python3.7/dist-packages/dogtail-0.9.9-py3.7.egg', '/usr/local/lib/python3.7/dist-packages/PyAutoGUI-0.9.53-py3.7.egg', '/usr/lib/python3/dist-packages']
-
没有all的init,和有all的init
先看看没有all的
package/init.py
init1 = 'init1' init2 = 'intt2' print('执行了__ini__.py')
a.py
from package import * print(init2) print(init1)
我们执行
python3 a.py
,执行结果:执行了__ini__.py intt2 init1
看看有all的init
package/init.py
init1 = 'init1' init2 = 'intt2' __all__ = ['init2'] print('执行了__ini__.py')
a.py
from package import * print(init2) print(init1)
我们执行
python3 a.py
,执行结果:执行了__ini__.py intt2 Traceback (most recent call last): File "/home/tarzan/Desktop/playw_test/a.py", line 4, in <module> print(init1) NameError: name 'init1' is not defined
可以看出all解决了让谁暴露、就让谁暴露,如果没有在all中,其他的文件就不能导入。