为什么python包里面总有__init__.py?
				
									
					
					
						|  | 
							admin 2025年10月28日 8:38
								本文热度 84 | 
					
				 
				在Python开发中,__init__.py文件堪称 “包的灵魂”,但很多开发者只知其存在,不懂其深意。结合 B 站热门教学视频的核心内容,今天我们不仅拆解它的核心作用,更完整还原视频中的代码案例和实操讲解,带你从零掌握这个关键文件的用法。
一、为什么包里面总有__init__.py?
为什么几乎所有 Python包目录下,都藏着一个__init__.py?答案很明确 —— 它是Python 包的 “身份凭证”。
Python解释器默认不会把普通文件夹当作 “包” 对待,哪怕文件夹里有.py文件,也只能视为普通目录。只有当目录中存在__init__.py时,解释器才会认定这是一个合法的 Python包,允许通过import语句导入其中的模块。
用一个简单对比验证了这一点:
- 无__init__.py的文件夹:尝试import 文件夹.模块会直接报错 “没有该模块”;
- 添加空的__init__.py后:导入语句正常执行,证明包的身份已被识别。
二、init.py 的3大实用功能(附代码详解)
我们通过具体代码案例,拆解了__init__.py除 “身份标识” 外的核心实用功能,每一步都有清晰的代码演示和效果说明:
1. 控制 “批量导入” 的可见性(__all__变量用法)
新手常困惑 “为什么用from 包 import *时,有些模块导不出来?”,答案就在__init__.py的__all__变量中。
代码案例:假设我们有如下包结构:
mypackage/    __init__.py    module1.py      module2.py      module3.py  
__all__ = ['module1', 'module2']  
效果:
- 执行from mypackage import *后,只能导入module1和module2,module3不会被导入;
- 作用:避免无关模块暴露,减少命名冲突,让代码更可控。
2. 初始化包级资源(全局变量 + 统一配置)
__init__.py会在包被导入时自动执行,用它来演示 “包级全局变量和初始化逻辑” 的定义。
代码案例:在__init__.py中定义:
__version__ = "1.0.0"__author__ = "Hucci"def package_common_func():    print("这是包的公共函数,所有子模块均可使用")print("包正在初始化...加载公共配置")
演示效果:
- 当执行import mypackage时,会自动打印 “包正在初始化... 加载公共配置”,完成全局变量和函数的初始化;
- 外部可直接通过mypackage.__version__获取版本号,子模块内也能调用package_common_func()。
3. 简化导入路径(避免 “嵌套层级地狱”)
“多层嵌套包导入太繁琐”,而__init__.py能完美解决这个问题,通过提前导入子模块,缩短外部调用路径。
代码案例:原有包结构(嵌套层级深):
mypackage/    __init__.py    subpackage/        __init__.py        module.py  # 含类 MyClass
from mypackage.subpackage.module import MyClass
在mypackage/__init__.py中添加:from .subpackage.module import MyClass  
演示效果:
- 外部可直接简化导入:from mypackage import MyClass;
- 核心价值:减少代码冗余,让导入逻辑更清晰,尤其适合复杂包结构。
三、误区:Python 3.3 + 真的不需要__init__.py 了?
核心观点:
- Python3.3 引入 “命名空间包”,允许无__init__.py的目录作为 “简单命名空间包”,但仅适用于无需配置的极简场景;
- 只要涉及 “控制导入”“初始化配置”“定义公共资源”,__init__.py依然是必需的;
- 实战建议:为了代码规范性和兼容性,自定义包时建议始终创建__init__.py。
四、总结:init.py 的核心价值
__init__.py是Python包的 “管家”—— 既负责证明包的身份,又管理包的导入规则、初始化资源、简化调用路径,是编写规范Python项目的基础。
掌握它的用法,能让你的代码结构更清晰、维护更高效,尤其在大型项目开发中,更是不可或缺的关键文件。
阅读原文:
该文章在 2025/10/30 11:07:35 编辑过