基本概念
| 概念 | 解释 |
|---|---|
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文件如何将代码文件夹转换为可导入的软件包,通过三个实验展示了不同情况下导入模块的行为。实验表明,__init__.py在包导入时被执行,并允许子模块的识别。当子文件夹中也包含__init__.py时,整个目录结构可被深度导入。此外,__init__.py还可用于自动导入子模块。
829

被折叠的 条评论
为什么被折叠?



