四、模块包(Package)学习笔记
2026-02-21
Python基础
type
Post
status
Published
date
Feb 21, 2026
slug
python-package-module-notes-4
summary
把所有模块都平铺在项目根目录,文件多了就乱成一团。学会用包(Package)后,我可以把模块按功能分类放进不同文件夹,就像把书籍分类放在书架上,想找什么一目了然!
tags
category
Python基础
icon
password
💡 学习感悟:把所有模块都平铺在项目根目录,文件多了就乱成一团。学会用包(Package)后,我可以把模块按功能分类放进不同文件夹,就像把书籍分类放在书架上,想找什么一目了然!
1. 什么是包?
包是一个包含
__init__.py 文件的文件夹,用于组织多个模块。📝 我的理解:包就像是书架——__init__.py是书架标签,文件夹里的.py文件是书,子包是书架上的分类区域。
2. 创建包
2.1 包的基本结构
📝 我的理解:__init__.py就像是包的门面——用户导入包时,首先执行这个文件,可以在这里做初始化、导常用功能。
2.2 init.py 的作用
3. 导入包
3.1 导入整个包
📝 我的理解:import mypackage导入的是__init__.py中暴露的内容。
3.2 从包导入模块
3.3 从包导入指定内容
📝 我的理解:从包导入就像是从书架取书——可以直接拿(from mypackage import add),也可以先找到分类再拿(from mypackage.math_tools import add)。
4. 子包
4.1 创建子包
4.2 导入子包
📝 我的理解:子包就像是书架上的分类区——mypackage.utils是工具分类区,里面再放具体的工具书。
5. 相对导入与绝对导入
5.1 绝对导入
📝 我的理解:绝对导入就像是完整地址——从省市区到门牌号,不管在哪里都能准确找到。
5.2 相对导入
📝 我的理解:相对导入就像是邻居串门——..是楼上(父包),.是隔壁(同级)。
5.3 相对导入规则
符号 | 含义 | 示例 |
. | 当前目录 | from . import module |
.. | 上级目录 | from .. import module |
... | 上上级目录 | from ... import module |
⚠️ 注意:入口文件(直接运行的文件)不能使用相对导入!
6. 包的 all 变量
6.1 控制包级导出
6.2 使用 * 导入
📝 我的理解:包的__all__就像是白名单——告诉 Python,用from mypackage import *时,只允许导出这些内容。
7. 命名空间包(Python 3.3+)
7.1 无 init.py 的包
📝 我的理解:命名空间包就像是虚拟文件夹——不需要__init__.py也能当成包用,但功能有限。
7.2 普通包 vs 命名空间包
特性 | 普通包(有 init.py) | 命名空间包(无 init.py) |
初始化代码 | ✅ 支持 | ❌ 不支持 |
all 控制 | ✅ 支持 | ❌ 不支持 |
相对导入 | ✅ 支持 | ✅ 支持 |
跨目录合并 | ❌ 不支持 | ✅ 支持 |
💡 建议:普通项目还是使用普通包(带__init__.py),功能更完整。
8. 踩坑记录
8.1 忘记创建 init.py
⚠️ 踩坑:Python 2 和普通包必须有__init__.py,否则无法识别为包!
8.2 入口文件使用相对导入
⚠️ 踩坑:直接运行的文件(入口文件)不能用相对导入!用绝对导入或修改sys.path。
8.3 循环导入(包级别)
⚠️ 踩坑:包内的模块之间也可能循环导入,解决方案同普通模块。
9. 核心知识点整理
9.1 包结构速查
9.2 导入方式对比
方式 | 语法 | 使用场景 |
导入包 | import mypackage | 使用包中暴露的功能 |
导入模块 | from mypackage import module | 使用具体模块 |
导入函数 | from mypackage.module import func | 直接使用函数 |
相对导入 | from . import module | 包内模块间导入 |
9.3 包开发 checklist
创建
__init__.py 文件添加包文档字符串
使用
__all__ 控制导出(可选)在
__init__.py 中简化常用导入避免入口文件使用相对导入
避免循环导入
Loading...
