python-装饰器
python装饰器
Python装饰器看起来类似Java中的注解,然而和注解并不相同,不过同样能够实现面向切面编程。
想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。
- 闭包
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
简单理解就是函数内部返回一个函数
def func():
massage = "This is a closure message"
# 这是内嵌函数
def closure_func():
# 可以使用外部函数的变量
print(massage)
pass
return closure_func
pass
# 获取一个闭包
closure = func()
# 输出信息:This is a closure message
closure()
massage 是一个局部变量,在func函数执行之后应该就不会存在了。但是嵌套函数引用了这个变量,将这个局部变量封闭在了嵌套函数中,这样就形成了一个闭包。
- 装饰器的常用场景:
1、引入日志
2、函数执行时间统计
3、执行函数前预备处理
4、执行函数后清理功能
5、权限校验等场景
6、缓存
7、事务处理
这里模拟一个函数执行时间统计的场景
import time
def run_time(func):
# 这是一个闭包
def wapper(*args, **kwargs):
# 开始时间
start = time.time()
func(*args, **kwargs) # 运行函数
# 结束时间
end = time.time()
print(f"run time:{end - start}")
pass
return wapper
pass
# 这是要装饰的函数
@run_time
def func():
time.sleep(2)
pass
func()
结果:
run time:2.00065541267395
- 带参数的装饰器
和不带参数的装饰器基本一样的
import time
def run_time(func):
# 这是一个闭包
def wapper(*args, **kwargs):
# 开始时间
start = time.time()
func(*args, **kwargs) # 运行函数
# 结束时间
end = time.time()
print(f"run time:{end - start}")
pass
return wapper
pass
# 这是要装饰的函数
@run_time
def func(i):
time.sleep(i)
pass
func(3)
结果:
run time:3.0009799003601074
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术