__init__.py
是 Python 包(package)机制的关键文件。简单来说,它的作用就是 把一个目录变成 Python 可以识别的包,从而允许你用 import
来导入其中的模块。
1. 基础作用
- 在 Python 早期版本(3.3 以前),如果目录里没有
__init__.py
,那它就只是普通文件夹,不能当作包导入。 - 有了
__init__.py
,Python 解释器会把这个目录当作一个 包。
举个例子:
project/
mypkg/
__init__.py
module1.py
module2.py
你就能写:
import mypkg.module1
如果没有 __init__.py
,就会报错。
2. 文件内容
__init__.py
本身 可以是空的,但也可以写代码。
常见用途有:
- 包初始化逻辑:在导入包的时候执行,比如加载配置、检查依赖。
控制包的导出内容:通过
__all__
定义哪些模块/函数可以被from mypkg import *
导入。__all__ = ["module1", "module2"]
简化导入路径:在
__init__.py
里直接导入子模块,这样用户用起来更方便。from .module1 import func1 from .module2 import func2
这样就能:
from mypkg import func1, func2
3. Python 3.3 之后的变化
- Python 3.3 引入了 隐式命名空间包(namespace package),即使没有
__init__.py
,也能把目录当作包。 但在实际项目里,
__init__.py
依然很常见,主要是:- 提高兼容性(对旧 Python 版本)。
- 便于组织代码和控制导入。
4. 类比理解
可以把 __init__.py
看成 包的门卫:
- 如果门卫不存在(Python 3.2 以前),这个“房子”(目录)进不去。
- 有了门卫,你进门的时候还能顺便做点事(初始化、导出、封装)。