python中的装饰器
Python 装饰器,通俗讲就是:
装饰器(Decorator)就是一个可以包装另一个函数的特殊函数,它可以在不修改原函数代码的情况下,增强函数的功能。
可以理解为**“给函数加个外壳”**,在执行原函数前后做点额外的事情。
📌 举个例子
🌰 例子:统计函数的执行时间
不使用装饰器的写法
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
计时代码,如果有多个函数要计时,就得重复写很多次。✅ 用装饰器优化
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
,比如:
@timer
def another_function():
time.sleep(1)
print("Another task done!")
📌 装饰器的核心原理
装饰器本质上就是一个**“包装函数”**,它:
- 接收一个函数(如
slow_function
)。 - 定义一个“壳子” (
wrapper
),在调用原函数前后加点东西(如计时)。 - 返回这个“壳子”,让它代替原来的函数。
等效于手动写:
slow_function = timer(slow_function) # 用装饰器包装原函数
slow_function() # 现在 slow_function 其实是 wrapper()
📌 装饰器还能干啥?
除了计时,装饰器还能用来:
✅ 日志记录(@log
,自动记录函数调用情况)
✅ 权限检查(@login_required
,检查用户是否登录)
✅ 输入参数验证(@validate
,自动检查参数合法性)
✅ 缓存结果(@lru_cache
,自动缓存计算结果,加速运行)
📌 总结
@装饰器名
直接给函数套壳作者:背太阳的牧羊人