项目稍大一点,就不能把所有代码塞进一个文件。本篇先讲清什么是模块、为什么要用模块,以及自定义模块、五种导入方式和搜索顺序。
本篇目录
1. 什么是模块
2. 为什么要使用模块
3. 模块的三种分类
4. 自定义模块
5. 模块导入方式
6. 模块搜索顺序
1. 什么是模块
在 Python 中,一个 .py 文件通常就是一个模块(Module)。可以把模块理解成工具箱:把相关代码集中放在一起,需要时再导入使用。
一个模块里可以放:
| |
|---|
| num = 100 |
| def test(a, b): ... |
| class User: ... |
| MAX_RETRY = 3 |
| |
目的只有一个:按功能拆分代码,统一管理。
2. 为什么要使用模块
如果所有逻辑都写在一个文件里,文件会越来越难读、难改、难协作。使用模块通常能带来:
1. 结构更清晰
2. 复用更容易(一次编写,多处导入)
3. 团队可并行开发不同模块
4. 维护成本更低
5. 降低不同功能区的命名冲突风险
3. 模块的三种分类
| | |
|---|
| | random |
| | my_module1.py |
| | requests |
标准库示例:
import random# randint 包头也包尾number = random.randint(1, 9)print(number)4. 自定义模块
每个 Python 文件都可作为模块,模块名通常就是去掉 .py 后的文件名。
4.1 命名规则
• 符合标识符规则:字母、数字、下划线;不能以数字开头;不能是关键字;不能含空格
• 见名知意,大小写敏感
• 推荐小写加下划线,如 add_num.py、login.py
• 不要与标准库同名,否则可能导入到错误模块
4.2 定义模块
新建 my_module1.py:
num = 100def test(a, b): print(a + b)4.3 测试代码与 __name__
开发模块时,常会在文件末尾写几行自测。如果直接调用:
num = 100def test(a, b): print(a + b)test(10, 20)那么只要这个模块被导入,测试代码也会执行,这通常不是你想要的。
正确写法是用入口判断:
num = 100def test(a, b): print(a + b)if __name__ == "__main__": test(10, 20)__name__ 是每个模块的内置变量:
因此 if __name__ == "__main__": 的含义是:只有直接运行本文件时,才执行测试或启动逻辑。
5. 模块导入方式
常见五种写法:
# 1. 导入整个模块import my_module1my_module1.test(10, 20)print(my_module1.num)# 2. 起别名import my_module1 as mmprint(mm.num)# 3. 导入指定名称from my_module1 import numprint(num)# 注意:这里只导入了 num,不能写 my_module1.test(...)# 若也要函数,应:from my_module1 import num, test# 4. 导入并起别名(解决同名冲突)from my_module1 import num as n1from my_module2 import num as n2print(n1, n2)# 5. 星号导入(不推荐)from my_module1 import *from my_module2 import *print(num)test(10, 20)# 后面导入的同名对象会覆盖前面的,容易踩坑选型建议:
| |
|---|
import module | |
import module as alias | |
from module import name | |
from module import name as alias | |
from module import * | |
6. 模块搜索顺序
执行 import my_module1 时,解释器会按顺序查找,找到即停止;找不到则抛出 ModuleNotFoundError。
大致顺序:
1. 当前工作目录 / 脚本所在项目目录
2. sys.path 中的其余目录(标准库、site-packages、虚拟环境等)
可查看搜索路径:
import sysprint(sys.path)示例目录结构:
project/├── my_module1.py└── test.py在 test.py 中 import my_module1 时,会先在当前项目目录找到同级的 my_module1.py。