#seven 包
#t 包
__init__.py的基本作用一:当一个包被导入的时候,那么__init__.py文件将首先被执行,而且是被python自动的去执行。
例:
在t包的 __init__.py文件里定义一个变量
a='This is __init__.py file'
print(a)
在seven包新建模块c11.py,在c11.py写入代码
import t
在终端运行c11.py结果:<<<This is __init__.py file
包的机制非常有用在项目中通常会在__init__.py里面做包和模块的初始化工作,这个是她的应用场景。
思考如果导入的不是t包,而是t下面的模块或者是模块下面的某一个变量__init__.py文件会自动运行吗?
t包下定义一个模块c7.py
__all__=['a','c']
a=2
c=3
d=4
我们在c11.py中换一种写法:
from t.c7 import a
在终端运行c11.py结果:<<< This is __init__.py file
所以说无论是导入的包还是导入的包下面的某一个模块的变量python都会自动的运行__init__.py文件
在__init__.py文件中同样可以运用__all__内置变量哪些变量被导出
在t包下面定义模块c8.py
e=2
f=3
g=4
在__init__.py写入
__all__=['c7']
在终端运行c11.py结果:
2
Traceback (most recent call last):
File "c11.py", line 3, in <module>
print(c8.e)
NameError: name 'c8' is not defined
是因为__init__.py __all__变量起了作用,由于我们的__init__.py文件只定义了c7,如果想通过* 导入包下面的模块
只会导入c7,c8没有定义,所以c8是不可以引用的。
__init__.py的作用二:批量导入。
在seven包下面新建模块c12
import sys
import datetime
import io
print(sys.path)
在seven包下面新建模块c13
import sys
import datetime
import io
print(sys.path)
假如说在c12中引入这三个库,在c13中也要引入,c14 c15等等很多个模块都要引入,在每个模块下面都import
是非常麻烦的。
在__init__.py文件下写入
import sys
import datetime
import io
我们删除c12.py 和c13.py 代码中的引入模块
import sys
import datetime
import io
c12.py 和c13.py 的代码print(sys.path) 是不会被打印的,原因是因为没有被定义。
此时想打印print(sys.path)没有必要再引入那三个库。
例:
在c13.py中写入代码import t
import t
print(t.sys.path)
我们在平时编码里面如有一个系统思维,这样的机制是使用非常多的。