库初始化文件__init__.py其实工作作用类似类初始化__init__(self).
类的初始化函数__init__.py就是每次实例化类的时候都会进行调用。
文件夹里面如果包含了__init__.py文件就会识别为一个库(lib),当其他文件进行导入这个库的时候就会运行__init__.py
举例说明:
比如先创建了如图目录:
testTmp下__init__.py内容如下:
#coding=utf-8
print("你现在导入了这个包!")
a=1
b=2
__version__="0.0.0"
import sys
print(sys.version_info)
father1下内容如下:
#coding=utf-8
print("你现在导入了包father1!")
a=1
b=2
print("father1")
father2代码如下:
#coding=utf-8
print("你现在导入了包father1!")
a=1
b=2
print("father1")
son1代码如下:
import testTmp
#coding=utf-8
print("你现在导入了包son1!")
a=1
b=2
print("son1")
运行son1.py的结果如下:
D:\AUTO\Python3.8\python.exe D:/AUTO/WEBAuto_pythonV2.3_20200323/testTmp/sonlib/son1.py
你现在导入了这个包!
sys.version_info(major=3, minor=8, micro=0, releaselevel='final', serial=0)
你现在导入了包son1!
son1
Process finished with exit code 0
从结果可以看出,son1.py运行的时候,导入testTmp包的时候同时运行了下面的__init__.py文件
现在我们再修改son1.py为:
#coding=utf-8
from testTmp import father1
print("*****************")
from testTmp import father2
print("+++++++++++++++++++++++")
print("你现在导入了包son1!")
a=1
b=2
print("son1")
运行结果为:
D:\AUTO\Python3.8\python.exe D:/AUTO/WEBAuto_pythonV2.3_20200323/testTmp/sonlib/son1.py
你现在导入了这个包!
sys.version_info(major=3, minor=8, micro=0, releaselevel='final', serial=0)
你现在导入了包father1!
father1
*****************
你现在导入了包father2!
father2
+++++++++++++++++++++++
你现在导入了包son1!
son1
Process finished with exit code 0
从上面结果可以看出导入库下面的某个子目录也会运行__init__.py文件,同时如果导入这个库下面的多个文件只会运行一次。
工作原理等同类里面的方法,实例化类会运行一次__init__()方法,后面调用其他方法的时候就不会再多次初始化。库则是导入库只运行__init__.py文件一次。
***如果在导入库的时候不想导入下面的子文件,则用__all__限制导入范围。