page contents

为什么python包里面总有__init__.py?

在Python开发中,__init__.py文件堪称 “包的灵魂”,但很多开发者只知其存在,不懂其深意。结合 B 站热门教学视频的核心内容,今天我们不仅拆解它的核心作用,更完整还原视频中的代码案例和实操讲解,带你从零掌握这个关键文件的用法。

attachments-2025-10-EloRCUx7690413d4e4858.png在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  # 含函数 func1()    module2.py  # 含函数 func2()    module3.py  # 含函数 func3()

__init__.py中添加:

# __init__.py中的代码__all__ = ['module1''module2']  # 明确指定可被“*”导入的模块

效果

  • 执行from mypackage import *后,只能导入module1module2module3不会被导入;
  • 作用:避免无关模块暴露,减少命名冲突,让代码更可控。

2. 初始化包级资源(全局变量 + 统一配置)

__init__.py会在包被导入时自动执行,用它来演示 “包级全局变量和初始化逻辑” 的定义。

代码案例:在__init__.py中定义:

# __init__.py中的代码# 1. 定义包级全局变量__version__ = "1.0.0"__author__ = "Hucci"# 2. 定义包内公共函数(所有子模块可调用)def package_common_func():    print("这是包的公共函数,所有子模块均可使用")# 3. 初始化公共配置(如数据库连接)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中添加:

# 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项目的基础。

掌握它的用法,能让你的代码结构更清晰、维护更高效,尤其在大型项目开发中,更是不可或缺的关键文件。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1475 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 1475 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章