一、什么是模块,为什么要用模块?
在Python中,模块就是一个.py
文件。它把函数、类和变量组织到一个独立空间里,从而实现代码复用、分层管理和冲突隔离。
简单来说:
- 用模块,代码更整洁
- 提升协作与维护效率
- 有利于项目扩展和调试
例子:
一个名为math_utils.py
的模块可以专门放与你数学相关的函数与类。
二、模块的导入与使用
最基础的用法就是 import
# 文件 math_utils.py
def add(a, b):
return a + b
# 在其他.py文件或Py交互环境中
import math_utils
print(math_utils.add(2, 3))
2.1 其他导入方式
- 只导入部分成员
from math_utils import add
- 为模块或成员起别名
import math_utils as mu
from math_utils import add as fast_add
- 一次性导入多个成员
from math_utils import add, sub, mul
- 导入整个包(见高级部分)
2.2 导入机制底层探索
- Python会把已经导入的模块缓存到
sys.modules
里 - 自定义模块首先在当前目录查找,找不到再走
sys.path
三、__name__
与__main__
:模块的自检与执行
每个模块有一个内置的__name__
变量。
# utils.py
def hello():
print("Hello!")
if __name__ == '__main__':
hello() # 只有当直接运行utils.py时才执行这行
用途?
- 让模块既能被导入又能独立运行,适用于脚本和工具开发。
四、包(Package)与多级模块
一个包就是包含__init__.py
文件的文件夹,可以嵌套模块和子包。
目录结构样例:
my_proj/
__init__.py
core.py
math_utils.py
string_utils.py
data/
__init__.py
csv_tools.py
导入用法:
from my_proj.data.csv_tools import read_csv
- 注意:空的
__init__.py
即可标记包,没它就不是包!
五、模块的命名空间与作用域
- 重名怎么办?用“全路径”区分(
from my_proj.core import func
) - 避免
from xxx import *
,容易引发命名冲突
六、模块的常见高级用法
6.1 模块重载与懒加载
- 开发调试时,用
importlib.reload(mod)
重新加载模块 - 第三方大包可以用
importlib
进行延迟加载,优化性能
6.2 __all__控制导入可见性
all 是针对模块公开接口的一种约定,比起双下划线的方式(私有变量或者私有函数), all 以提供了”白名单“的形式暴露接口 在模块里:
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def _divide(a, b):
if b != 0:
return a / b
else:
return "Error: Division by zero"
__all__ = ['subtract', 'add']
# __all__ = ['safe_function', 'important_class']
这样 from mod import *
只导入__all__
里的内容
6.3 模块搜索路径自定义
环境变量PYTHONPATH
、代码动态调整sys.path
,都可以控制模块查找范围。
import sys
sys.path.append('/my/custom/path')
6.4 绝对导入和相对导入
- 绝对:
from my_proj.core import func
- 相对:
from .core import func
,适合多文件大项目
七、Python标准库和第三方模块
7.1 标准库:自带诸多高效模块
如os
、sys
、datetime
、json
、collections
等。
7.2 安装第三方模块
- 用pip:
pip install requests
- 虚拟环境隔离:
python -m venv venv
八、模块化项目组织最佳实践
- 每个功能区块一个包,逻辑分层
- 使用
__init__.py
导出核心API - 公私成员用下划线约定(如
_internal_func
) - 入口脚本单独放(如
main.py
、run.py
)
如果你喜欢这篇文章,欢迎点赞、收藏和转发,更多Python干货内容敬请关注!