一、模块基础
什么是模块?
-
包含 Python 定义和语句的 .py 文件
-
解决代码复用和组织问题
-
每个模块有自己的命名空间
创建模块示例
# fibo.py - 斐波那契模块
def fib(n):
"""打印小于n的斐波那契数列"""
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a + b
print()
def fib2(n):
"""返回小于n的斐波那契数列列表"""
result = []
a, b = 0, 1
while a < n:
result.append(a)
a, b = b, a + b
return result
二、模块详解
导入方式
- 基本导入
import fibo
fibo.fib(1000) # 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
fibo.fib2(100) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
- 导入特定函数
from fibo import fib, fib2
fib(500) # 直接使用,无需模块名前缀
- 导入所有(不推荐)
from fibo import * # 可能污染命名空间
- 使用别名
import fibo as fib
fib.fib(500)
from fibo import fib as fibonacci
fibonacci(500)
模块特性
-
一次性初始化:模块代码只在第一次导入时执行
-
独立命名空间:避免命名冲突
-
可重载:使用 importlib.reload()
1 以脚本方式执行模块
双重用途模式
# 在模块末尾添加:
if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))
使用方法:
# 作为脚本执行
python fibo.py 50
# 输出: 0 1 1 2 3 5 8 13 21 34
# 作为模块导入
import fibo # 不执行测试代码
2 模块搜索路径
Python 搜索模块的顺序:
-
内置模块 (sys.builtin_module_names)
-
sys.path 中的目录:
-
当前脚本目录
-
PYTHONPATH 环境变量
-
标准库和 site-packages
import sys
print(sys.path) # 查看搜索路径
sys.path.append('/my/module/path') # 添加自定义路径
3 编译的 Python 文件
-
缓存文件:pycache/module.version.pyc
-
自动对比源码修改日期
-
提高加载速度,不影响执行速度
优化选项:
python -O script.py # 去除断言
python -OO script.py # 去除断言和文档字符串
三、标准模块
常用标准模块
import sys
# 交互模式提示符
sys.ps1 = 'C> ' # 主提示符
sys.ps2 = '... ' # 次提示符(仅交互模式)
# 模块搜索路径操作
sys.path.append('/ufs/guido/lib/python')
# 平台特定模块
try:
import winreg # 仅Windows可用
except ImportError:
print("winreg module not available")
四、dir() 函数
查看对象内容
import fibo, sys
# 查看模块内容
print(dir(fibo)) # ['__name__', 'fib', 'fib2']
print(dir(sys)) # 显示sys模块的所有属性
# 查看当前命名空间
a = [1, 2, 3, 4, 5]
import fibo
fib = fibo.fib
print(dir()) # 显示所有当前定义的名称
# 查看内置函数
import builtins
print(dir(builtins))
五、包(Package)
包的结构
sound/ # 顶层包
__init__.py # 初始化包(必需)
formats/ # 子包
__init__.py
wavread.py
wavwrite.py
effects/ # 子包
__init__.py
echo.py
surround.py
filters/ # 子包
__init__.py
equalizer.py
导入方式
- 绝对导入
import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
- 从包中导入模块
from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
- 直接导入函数
from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)
1 从包中导入 *
控制导入内容
# sound/effects/__init__.py
__all__ = ["echo", "surround", "reverse"]
# 使用
from sound.effects import * # 只导入 __all__ 中指定的模块
注意事项
# 如果本地有同名函数,会覆盖子模块
__all__ = ["echo", "surround", "reverse"]
def reverse(msg: str): # 这会覆盖 reverse.py 子模块
return msg[::-1]
2 相对导入
包内模块引用
# 在 sound/effects/surround.py 中
from . import echo # 从当前包导入
from .. import formats # 从上级包导入
from ..filters import equalizer # 从兄弟包导入
注意: 主模块必须使用绝对导入
3 多目录中的包
扩展包路径
# 修改包的搜索路径
import mypackage
mypackage.__path__.append("/path/to/extra/modules")
六、⚡ 重要特性总结
模块特性
-
name 变量:模块名,“main” 表示直接运行
-
独立命名空间:避免全局变量污染
-
一次性初始化:避免重复执行初始化代码
包特性
-
必须包含 init.py:标识目录为包
-
分层组织:使用点号表示法
-
相对导入:支持包内模块间的相对引用
最佳实践
-
使用绝对导入:提高代码可读性和可维护性
-
避免 from module import *:明确导入所需内容
-
使用 if name == “main”:使模块可执行也可导入
-
合理组织包结构:按功能划分模块
七、🔧 实用技巧
动态导入
# 按需导入模块
module_name = "json"
json = __import__(module_name)
# 使用 importlib
import importlib
json = importlib.import_module("json")
查看模块信息
import math
print(math.__name__) # 模块名
print(math.__file__) # 模块文件路径
print(math.__doc__) # 模块文档字符串
重载模块
# 开发时重新加载模块
import importlib
importlib.reload(module_name)
八、🎯 模块系统优势
-
代码复用:避免重复造轮子
-
命名空间管理:避免命名冲突
-
代码组织:大型项目的结构化基础
-
维护性:便于团队协作和代码维护
Python 的模块系统是其生态系统繁荣的基础,理解和熟练使用模块系统是成为 Python 开发高手的关键一步!