模块和包
模块(module)与包(package)是 Python 代码组织、复用与发布的核心机制:把可复用的代码放进“模块文件”,把多个模块组织成“包”,再通过 import 体系进行引用。
先有一个直觉
- 模块:一个
.py文件(或可被 import 的扩展模块)就是一个模块 - 包:一个目录,里面可以放多个模块与子包;通常以
__init__.py作为包的入口 - 导入:把某个模块加载到当前运行环境,并通过名字访问其中的对象(函数/类/变量)
为什么要用模块/包
- 降低单文件复杂度:按“领域/职责”拆分文件
- 提升复用:工具函数、通用组件可以跨项目复用
- 形成边界:明确哪些 API 允许对外使用(可通过
__all__等约束)
导入方式速查
import 模块名:通过模块名.xxx访问import 模块名 as 别名:缩短名字或避免冲突from 模块名 import 名称1, 名称2:直接导入名称from 模块名 import *:不推荐;受__all__控制(见 all 列表)
搜索路径(import 到底去哪找)
导入时 Python 会按一定顺序在“模块搜索路径”中查找目标,常见来源包括:
- 当前项目/当前工作目录
- 虚拟环境与 site-packages
- 标准库
在工程化项目里,更推荐使用“包结构 + 相对稳定的入口模块”,而不是依赖运行目录的偶然性。
包的组织建议
- 把“入口 API”写在包的
__init__.py中(需要谨慎控制对外暴露) - 同一包内部引用优先使用“相对导入”或明确的包路径,避免循环依赖
- 避免把所有东西都堆在一个
utils.py;按领域拆分更可维护