
__init__.py 文件是 Python 包(package)的标识文件,它的存在让一个普通目录被解释器识别为包,从而支持模块导入和相对导入。
让目录变成可导入的包
Python 规定:只有包含 __init__.py 的目录,才能被当作包来导入。即使该文件为空,只要存在,import mypackage 就能成功执行。
- 没有 __init__.py,目录只是普通文件夹,无法用
import加载其中的模块 - 文件可以为空,也可以包含代码——它会在包首次被导入时自动运行一次
- 从 Python 3.3 起,支持“隐式命名空间包”(即无 __init__.py 的包),但仅限于特定场景(如跨目录拼接包),常规项目仍应显式保留该文件
控制 from package import * 的行为
在 __init__.py 中定义 __all__ 列表,可明确指定 from package import * 允许导入的名称。
- 例如:
__all__ = ['load_config', 'save_data'],则from mypkg import *只导入这两个函数 - 若不定义 __all__,
import *默认只导入不以下划线开头的模块级名称(但行为不稳定,不推荐依赖) - 这是封装接口、避免污染导入命名空间的重要手段
简化包的使用入口
常在 __init__.py 中导入并重新导出子模块的关键内容,使用户无需写冗长路径。
立即学习“Python免费学习笔记(深入)”;
- 比如
mypackage/utils.py有函数validate_email,可在 __init__.py 写:from .utils import validate_email - 用户就能直接写
from mypackage import validate_email,而非from mypackage.utils import validate_email - 也支持设置别名或组合多个模块的常用功能,统一暴露简洁 API
执行包级初始化逻辑
__init__.py 是包加载时最先执行的代码,适合做一次性的环境检查、配置加载或全局状态设置。
- 例如:检查依赖版本、读取包内默认配置文件、注册插件类、设置日志格式等
- 注意避免耗时操作或副作用过强的代码,否则会影响所有导入该包的场景
- 若需延迟初始化,建议把逻辑封装成函数,在真正需要时调用,而非全放在 __init__.py 顶层
不复杂但容易忽略。一个合理的 __init__.py 能让包更健壮、易用、可维护。






