在 Python 中,Module(模块)、Package(包) 以及 Library(库) 是组织代码的核心概念,它们就像文件、文件夹和图书馆的关系一样,层层递进。
核心组织层级
1. Module(模块):单个代码文件
- 本质:任何一个以
.py结尾的 Python 文件 就是一个模块。 - 目的:把相关的变量、函数、类组织在同一个文件里,方便复用和管理。
- 示例:你写了一个
math_utils.py,里面包含各种数学计算函数。这个文件就是一个 Module。 - 使用方式:
import math_utils[1]
2. Package(包):包含模块的文件夹
-
本质:一个包含多个模块(
.py文件)的 目录/文件夹。 -
目的:当模块越来越多时,单文件会变得臃肿。Package 通过“目录树”的结构,把功能相近的模块组织在一起,形成分层命名空间(如
A.B)。 -
特征:通常包含一个
__init__.py文件(常规包)[1]。 -
示例:
game/ # 这是一整个 Package ├── __init__.py ├── sound/ # 这是一个子包 (Sub-package) │ ├── __init__.py │ └── echo.py # 这是一个 Module └── graphics/ # 另一个子包 ├── __init__.py └── screen.py # 另一个 Module -
使用方式:
import game.sound.echo
3. Library(库):更宏观的概念
- 本质:一个模糊的统称,通常指由 一个或多个 Package / Module 组成的高级集合。
- 目的:为了解决某一类特定问题而提供的一整套工具。
- 分类:
- 标准库(Standard Library):Python 自带的库,不需要安装,直接导入(如
os,sys,json)。 - 第三方库(Third-party Library):别人写好并发布到 PyPI 上的库,需要用
pip install安装(如requests,numpy,pandas)。
- 标准库(Standard Library):Python 自带的库,不需要安装,直接导入(如
进一步阅读:代码的微观组织:Variable (变量)、Function (函数)、Class (类)
1. Variable (变量) —— 最小的数据单元
- 本质:指向内存中某个对象的标签。
- 组织核心:LEGB 作用域法则——Python 寻找一个变量时,会严格按照 L ➔ E ➔ G ➔ B 的顺序从内到外依次查找,找不到就会报
NameError。。- L (Local):函数内部。
- E (Enclosing):闭包(外部嵌套函数)。
- G (Global):当前模块/文件顶层。
- B (Built-in):Python 内置(如
len,str)。
- 组织建议:尽量避免使用
global关键字。数据应当通过参数显式传递,保持函数“纯净”。
2. Function (函数) —— 最小的逻辑单元
- 本质:封装了一段可重复执行的代码块。
- 组织核心:单一职责原则 (SRP)。
- 一个函数应当只做一件事(例如:
计算税率和打印发票应该拆分为两个函数)。
- 一个函数应当只做一件事(例如:
- 组织建议:函数名使用动词或动宾短语(如
calculate_total)。如果函数超过 50 行,通常意味着可以继续拆分。
3. Class (类) —— 状态与行为的结合体
- 本质:将数据(属性/变量)和操作数据的方法(函数)打包在一起的蓝图。
- 组织核心:高内聚,低耦合。
- 类把相关的变量和函数内聚在一起,形成一个独立的实体。
- 组织建议:类名使用大驼峰(
PascalCase)。如果一个类只需要一个方法,通常写成一个普通的 Function 会更轻量、更 Pythonic。
标准项目目录
一个规范、易于发布和协作的 Python 项目,通常具备以下标准目录结构:
my_project/
│
├── my_package/ # 核心业务逻辑包
│ ├── __init__.py # 初始化包或暴露公开接口
│ ├── core.py # 核心功能模块
│ └── utils.py # 工具函数模块
│
├── tests/ # 单元测试目录
│ ├── __init__.py
│ └── test_core.py
│
├── docs/ # 项目文档
├── data/ # 数据文件(如模型权重、静态数据)
│
├── requirements.txt # 生产环境依赖包列表
├── setup.py / pyproject.toml# 项目安装与分发配置文件
├── README.md # 项目说明文件
└── LICENSE # 开源协议关键文件说明
__init__.py:在导入包时最先执行。常用于简化模块导入路径(例如:from my_package.core import func简化为from my_package import func)或定义包级别的全局变量。__main__.py:作为包的入口。如果包内包含此文件,可以直接通过python -m my_package运行整个包。
导入
导入规则
- 绝对导入 (Absolute Import):始终从项目根目录或第三方库的根路径开始导入,如
from my_package.core import function,这是推荐的标准做法。 - 相对导入 (Relative Import):使用
.表示当前目录,..表示父级目录,如from .utils import helper。仅适用于包内部模块之间的相互调用,方便重构。 - 避免通配符导入 (
from module import *):这会污染命名空间,导致变量来源不明。推荐显式导入所需对象。
导入语法
- 语法1:
import <X><X>必须是:一个 Module(模块/.py文件) 或一个 Package(包/文件夹)。- 绝对不能是:类(Class)、函数(Function)或变量(Variable)。
- 代码里的调用方式:必须带前缀:
X.name
- 语法2:
from <Y> import <Z><Y>必须是:一个 Package(包) 或一个 Module(模块)。<Z>可以是:任何东西(子包、模块、类、函数、变量)。- 代码里的调用方式:直接使用:
Z