本文针对Python开发者, 详细描述了__init__.py文件在参与包、模块、命名空间导入/重命名/初始化时的使用方法,以及其中代码的执行机制。本文描述了__init__.py文件的四大作用。
- 模块搜索标记
- 初始化命名空间, 空间名称即为目录名
- 设置__all__ 通配符导入目标
- 为同一目录的其他模块定义命名空间。
__init__.py 文件是每一个Python开发者都非常熟悉的文件。
这个文件究竟是干什么用的? 除了空文件以外,它里面可以有什么样的代码?我查阅了很多关于Python的文档,始终没有找到非常令人信服的详细文档资料。 即使是在Python的官方文档中,有的时候我也不知道究竟怎么解释才是正确的。所以,以下是我对于__init__.py文件的一个总结,里面包含了一些案例,以及相应的步骤。
- 模块、包和命名空间(module, package and namespace)
要想搞清楚__init__.py文件,就必须要搞清楚模块、包和命名空间之间的关系
1.1. 模块(module)
从一个宽泛的意义上来说,任何一个python文件都是一个模块。 可以被单独执行,也可以通过import语句被其他的Python程序所调用。在模块内,python代码可以去调用其他的模块。
我们都知道python是可以在控制台中去一行一行去执行的。那么,可以说,模块是将这些命令组织成为"程序"的基本组织单位了。
官方参考资料:3.11.1 Documentation » Python 教程 » 6. 模块
1.2. 包(package)
包由多个文件和一个目录结构组成。 一个包可以包含模块、子包等内容。在官方文档上有这样一句话:
要注意的一个重点概念是所有包都是模块,但并非所有模块都是包。或者换句话说,包只是一种特殊的模块。特别地,任何具有 path 属性的模块都会被当作是包。
当然,这句话对于初学者有点拗口。我们来搞一个实际的例子试试:
在PyCharm创建项目test01,目录如下
./
├─ tdouya2.py
├─ test01.py
└─ tdouya
└─ __init__.py
test01.py是唯一的入口文件。目录tdouya是一个包,而tdouya2.py是一个模块。
__init__.py、 tdouya2.py 都是空文件。 入口文件test01.py的代码为:
import tdouya
import tdouya2
if __name__ == "__main__":
print("tdouya.{}".format(tdouya.__path__))
print("tdouya2.{}".format(tdouya2.__path__))
执行结果:
D:\Python-grp\miniconda3_data\env\py3.10\python.exe E:\develop\python\test01\test01.py
tdouya.['E:\\develop\\python\\test01\\tdouya']
Traceback (most recent call last):
File "E:\develop\python\test01\test01.py", line 7, in <module>
print("tdouya2.{}".format(tdouya2.__path__))
AttributeError: module 'tdouya2' has no attribute '__path__'. Did you mean: '__name__'?
进程已结束,