python模块中__init__.py的作用
Posted 永远不要矫情
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python模块中__init__.py的作用相关的知识,希望对你有一定的参考价值。
基本概念
概念 | 解释 |
---|---|
import | 即导入,方式就是在import 位置将代码文件拷贝过去。 |
模块 | python中一个.py文件就是一个模块 |
包 | 指软件包,举例import matplotlib.pyplot 中(其中pyplot非函数,至少是一个模块或者包),matplotlib 就是一个软件包。 |
先上结论
__init__.py
的作用是让一个呈结构化分布(以文件夹形式组织)的代码文件夹变成可以被导入import
的软件包。且__init__.py 在包被导入时会被执行。
举例解释
为了形象地解释,我建立了一个test
文件夹,其中一个文件夹A
打算建立成一个软件包,然后尝试在B
文件夹的的run.py
文件下导入A
包中的模块。
实验一:不包含__init__.py
test
文件夹中包含的文件如下:
此时如果在B/run.py
中运行以下语句的结果为:
语句 | 运行结果 |
---|---|
import A | ImportError: No module named A |
import A.A_A | ImportError: No module named A.A_A |
import A.A_B | ImportError: No module named A.A_B |
结论:此时A
并不能被当成是一个软件包。
实验二:A
中包含__init__.py
A
文件夹下包含__init__.py
,test
文件夹结构变为如下:
在B/run.py
中运行以下语句的结果依次列在表中:
语句 | 运行结果 |
---|---|
import A | 成功 |
import A.A_A | ImportError: No module named A_A |
import A.A_B | 成功 |
结论:由A.A_B
能被成功import
看出此时A
已经是一个软件包,因为A
下的.py
文件已经能够程序识别出来。但是由于A
下的A_A
还不是一个软件包,所以A.A_A
还不能被导入。
实验三:A.A_A
中也包含__init__.py
A
文件夹及其子文件夹下都包含__init__.py
,test
文件夹结构变为如下:
在B/run.py
中运行以下语句的结果依次为:
语句 | 运行结果 |
---|---|
import A.A_B | 成功 |
import A.A_A | 成功 |
import A.A_A.A_A_A | 成功 |
结论:此时A
及其子文件夹A_A
都成功变成软件包,其中的模块可以被任意导入。
进阶
在上述实验中,发现导入
A
时并未将其下的子模块自动导入,当__init__.py
文件不为空时,其中可以填写from . import A_A
类似语句实现自动子模块导入。不含有
__init__.py
的包也可以当作命名空间包使用,使命名一致的包被统一管理。
以上是关于python模块中__init__.py的作用的主要内容,如果未能解决你的问题,请参考以下文章