2021-11-28(_init_.py的用法)

一、性质表述与论证

性质1:在导入一个包时,该包下的_init_.py模块首先会被执行,而且是被python自动的去执行(也就是说无需在终端输入文件路径进行执行)。

(环境)
2021-11-28(_init_.py的用法)_第1张图片
(1)在__init__.py模块中写入:e = ‘the world’

e = 'the world'
print(e)

(2)在p2.py中写入:import = case,终端会自动执行__init__.py模块内容

import case

(3)终端显示
结果

性质2:即使是导入包下面的其他模块时候,init.py的模块也会被自动的运行。
(1)a4.py中写入:d = 4

d = 4

(2)在p2.py中写入:from case.a4 import d ,print(d),终端会执行出d的结果,同时自动执行__init__.py模块内容

from case.a4 import d
print(d)

(3)终端显示
结果
总结
一、在from import中,如果是直接引用一个包,包中含有__init__.py模块时,会优先自动执行该模块

二、作用与实际运用场景

作用一(理解为作为一个包的控制阀模块)

在__init__.py中使用__all__ =[‘模块’]的时候,用import引用只能作用于__all__ = [‘模块’]中的模块。其他引用无效,即使是所引用模块中同样有__all__对模块中的某些参数有限制,也是无效的。
(1)在a3.py中写入:a = 1、b = 2、c = 3。在a4.py中写入:all = [‘e’,‘f’],d = 5、e = 6、f = 7。在__init__.py中写入:all = [‘a4’]

a = 1
b = 2
c = 3
__all__ = ['e','f']
d = 5
e = 6
f = 7
__all__ = ['a4']

(2)在p1.py中写入:from case import *,print(a4,d),print(a3.a)

from case import *
print(a4.d)
print(a3.a)

(3)终端结果
即使a4中做了__all__的限制还是输出了
(4)承接(2)调换在p1.py中的print顺序,写入:from case import *,print(a3,a),print(a4.d)

from case import *
print(a3.a)
print(a4.d)

则终端结果:无法输出a4。
print的顺序进行调换之后,无法输出a4的内容
总结

一、在__init__.py模块中对所在包中的某模块进行__all__的限制时,即使是某模块中同样存在对其中的参数进行__all__限制,在import的时候是无效的

二、在__init__.py模块中对所在包中的某模块进行__all__的限制时,import之后的print顺序会对终端结果有影响(见(4))。

作用二(本身作为一个公共的需求模块,供其他模块进行引用)

要在不同的模块中进行import引入时,基本的操作是在每个模块中都进行import,较为费时,此时可以使用__init__.py这个file,在file中写入需要import的内容,然后在需要引用的模块中直接import__init__.py所在的包,进行print指定参数即可。
(1)在__init__.py中写入:import sys,import datetime,import io,print(sys.path)

import sys    #python内置的库
import datetime
import io
print(sys.path)

(2)在需要引用的模块p1.py中写入:import case ,print(case.sys.path),在p2.py中写入:import case
print(case.sys.path)

import case 
print(case.sys.path)
import case 
print(case.sys.path)

(3)终端输出
输出结果
总结
init.py类似于一个公用的仓库,把公用的东西放在其中,有模块需要用到时,通过import init.py 所在的包,直接print即可得出结果

你可能感兴趣的:(python,开发语言,后端)