1. 装饰器:Python开发者的瑞士军刀
第一次接触Python装饰器时,我正试图为一个Web接口添加权限验证。当时写了无数个重复的if...else判断,直到发现同事用@login_required这样优雅的一行代码就解决了问题。这种"语法糖"背后,其实是Python最强大的元编程特性之一。
装饰器(decorator)本质上是一个高阶函数,它接受一个函数作为输入,返回一个新的函数。这种设计模式允许你在不修改原函数代码的情况下,动态增强函数功能。在实际工程中,装饰器常用于:
- 添加日志记录
- 权限校验
- 性能监控
- 输入验证
- 缓存处理
重要提示:理解装饰器需要掌握Python中"函数是一等公民"的特性,即函数可以作为参数传递、作为返回值,甚至可以嵌套定义。
1.1 为什么需要装饰器?
假设你正在开发一个电商系统,需要为所有支付相关函数添加交易日志。没有装饰器时,代码可能是这样的:
python复制def pay(order_id, amount):
# 记录日志
print(f"[LOG] 开始处理订单{order_id}, 金额{amount}")
# 实际支付逻辑
print("调用支付网关...")
# 记录日志
print(f"[LOG] 订单{order_id}处理完成")
这种写法有三大问题:
- 业务逻辑与辅助代码混杂
- 重复代码难以维护
- 修改日志格式需要改动所有函数
装饰器解决方案:
python复制def log_transaction(func):
def wrapper(*args, **kwargs):
print(f"[LOG] 开始处理订单{args[0]}, 金额{args[1]}")
result = func(*args, **kwargs)
print(f"[LOG] 订单{args[0]}处理完成")
return result
return wrapper
@log_transaction
def pay(order_id, amount):
print("调用支付网关...")
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 装饰器核心机制解析
2.1 装饰器的底层实现原理
装饰器的工作流程可以分为三个阶段:
- 定义阶段:创建装饰器函数,它接收目标函数作为参数
- 包装阶段:装饰器内部定义新函数(通常叫wrapper),在其中调用原函数
- 替换阶段:装饰器返回新函数,替代原函数
这个过程的本质是函数组合。Python解释器遇到@语法时,会自动执行:
python复制pay = log_transaction(pay)
2.2 保留函数元信息
直接使用装饰器会导致原函数的元信息(如__name__、doc)被wrapper覆盖:
python复制
