Python 装饰器,通俗讲就是:
装饰器(Decorator )就是一个可以包装另一个函数 的特殊函数,它可以在不修改原函数代码的情况下,增强函数的功能 。
可以理解为**"给函数加个外壳"**,在执行原函数前后做点额外的事情。
📌 举个例子
🌰 例子:统计函数的执行时间
不使用装饰器的写法
python
import time
def slow_function():
"""模拟一个耗时操作"""
start = time.time() # 记录开始时间
time.sleep(2) # 让函数暂停 2 秒
end = time.time() # 记录结束时间
print(f"Function executed in {end - start:.2f} seconds")
slow_function()
输出:
Function executed in 2.00 seconds
🔴 缺点:
- 我们手动在函数里加了
start
和end
计时代码,如果有多个函数要计时,就得重复写很多次。
✅ 用装饰器优化
python
import time
def timer(func):
"""计时装饰器"""
def wrapper():
start = time.time() # 记录开始时间
func() # 执行原函数
end = time.time() # 记录结束时间
print(f"Function executed in {end - start:.2f} seconds")
return wrapper # 返回包装后的新函数
@timer # 直接给 slow_function 套上计时功能
def slow_function():
time.sleep(2)
print("Task done!")
slow_function()
输出:
Task done!
Function executed in 2.00 seconds
🔵 好处:
-
@timer
自动给slow_function()
加上计时功能,而原函数的代码完全没改! -
以后如果有别的函数也要计时,只需加一行
@timer
,比如:python@timer def another_function(): time.sleep(1) print("Another task done!")
📌 装饰器的核心原理
装饰器本质上就是一个**"包装函数"**,它:
- 接收一个函数 (如
slow_function
)。 - 定义一个"壳子" (
wrapper
),在调用原函数前后加点东西(如计时)。 - 返回这个"壳子",让它代替原来的函数。
等效于手动写:
python
slow_function = timer(slow_function) # 用装饰器包装原函数
slow_function() # 现在 slow_function 其实是 wrapper()
📌 装饰器还能干啥?
除了计时,装饰器还能用来:
✅ 日志记录 (@log
,自动记录函数调用情况)
✅ 权限检查 (@login_required
,检查用户是否登录)
✅ 输入参数验证 (@validate
,自动检查参数合法性)
✅ 缓存结果 (@lru_cache
,自动缓存计算结果,加速运行)
📌 总结
- 装饰器 = 给函数加功能的"外壳"
- 用
@装饰器名
直接给函数套壳 - 可以在不修改原函数代码的情况下,增强其功能
- 常见应用:日志、权限、缓存、计时等