快速理解Python装饰器
话不多说,直接上重点:
本质:Python函数
功能:可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象
主要需求场景:性能测试、插入日志、事务处理、缓存、权限校验等
优势:可以抽离出大量与函数功能本身无关的雷同代码并继续重用,即:为已经存在的对象添加额外的功能
实验代码:
# 初级版 def use_logging(func): def wrapper(*args, **kwargs): # logging.warning("{} is running...".format(func.__name__)) print("{} is running...".format(func.__name__)) return func(*args, **kwargs) return wrapper def bar(): print("I am a bar") # bar = use_logging(bar) # bar() # 标准版 @use_logging def foo(): print("I am a good boy") foo() print("*"*20) # 带参数装饰器 def use_logging_v2(level): def decorate(func): def wrapper(*args, **kwargs): # logging.warning("{} is running...".format(func.__name__)) print("{} is running...".format(func.__name__)) return func(*args, **kwargs) return wrapper return decorate @use_logging_v2(level=3) def brother(): print("I am a bigger boy") brother() # 性能分析监视器 def calc_time(func): def wrapper(*args, **kwargs): print("This is {} spent time".format(func.__name__), end=':') t1 = time.time() func(*args, **kwargs) t2 = time.time() print(t2-t1) return wrapper @calc_time def worker(steps): walks = [1] * steps @calc_time def doctor(steps): walks = [1 for i in range(steps)] nums = 100000000 print("*"*20) worker(nums) doctor(nums)
结果展示:
时刻记着自己要成为什么样的人!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2020-04-16 Bert模型精简方法
2019-04-16 AAAI2018中的自注意力机制(Self-attention Mechanism)
2019-04-16 预训练模型迁移学习