概念 | 解释 |
---|---|
import |
即导入,方式就是在import 位置将代码文件拷贝过去。 |
模块 | python中一个.py文件就是一个模块 |
包 | 指软件包,举例import matplotlib.pyplot 中(其中pyplot非函数,至少是一个模块或者包),matplotlib 就是一个软件包。 |
__init__.py
的作用是让一个呈结构化分布(以文件夹形式组织)的代码文件夹变成可以被导入import
的软件包。
为了形象地解释,我建立了一个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
的包也可以当作命名空间包使用,使命名一致的包被统一管理。