当前位置: 首页 > news >正文

python装饰器用法

为什么用装饰器?

  • 第一个原因是,使用装饰器可以提升代码复用,避免重复冗余代码。如果我有多个函数需要测量执行时间,我可以直接将装饰器应用在这些函数上,而不是给多个函数加上一样的代码。这样的代码既元余也不方便后面维护
  • 第二个原因是,使用装饰器可以保证函数的逻辑清晰。如果一个本身功能就很复杂的函数,我还要通过修改内部代码来测量运行时间,这样会模糊函数自身的主逻辑。同时,软件开发的一个原则就是单一职责,也就是说,一个函数只应该承担一项责任
  • 第三,通过装饰器,我们可以扩展别人的函数。想象我们正在使用一个第三方库的函数,但我要添加额外的行为,比如测量运行时间,那我就可以用装饰器去包装,而不是跑到库里面去修改。
import time
import math#函数接收的参数为函数
def mysqrt(x):return math.sqrt(x)def print_running(f,x):print(f'{f.__name__} is running')return f(x)result= print_running(mysqrt,9)
print(result)

mysqrt is running
3.0

#基本的装饰器例子import time
def myDecorator(func):def warpper(*args,**kwargs):start_time=time.time()result=func(*args,**kwargs)end_time=time.time()print(f'{func.__name__} running time :{end_time-start_time}')return resultreturn warpperdec_mysqrt=myDecorator(mysqrt)
result=dec_mysqrt(9)
print(result)#使用@语法完成函数名字上面代码段的dec_mysqrt=myDecorator(mysqrt)替换
@myDecorator#函数接收的参数为函数
def mysqrt(x):return math.sqrt(x)x=mysqrt(10)
print(x)

mysqrt running time :0.0
3.0

#装饰器生成器:比如要要测量某函数运行时间是否超过阈值,但不同函数的阈值是不一样的,所以需要定义多个装饰器应对不同阈值吗?不,只需要用装饰器生成器
def timer(threshold):def decorator(func):def warpper(*args,**kwargs):start_time=time.time()result=func(*args,**kwargs)end_time=time.time()if (end_time-start_time>threshold):print(f'{func.__name__} running time is over {threshold} seconds')return resultreturn warpperreturn decorator@timer(0.2)
def sleep_04():time.sleep(0.4)# #上述写法的等价写法
# def sleep_04():
#     time.sleep(0.4)
# sleep_04 =timer(0.2)(sleep_04)sleep_04()
print(sleep_04.__name__)

sleep_04 running time is over 0.2 seconds
warpper

#但是上面的代码的sleep_04.__name__是warpper,不是sleep_04。
#能继承函数名字等参数的装饰器生成器import functools
def timer(threshold):def decorator(func):@functools.wraps(func)def wrapper(*args,**kwargs):start_time=time.time()result=func(*args,**kwargs)end_time=time.time()if (end_time-start_time>threshold):print(f'{func.__name__} running time is over {threshold} seconds')return resultreturn wrapperreturn decorator@timer(0.2)
def sleep_04():time.sleep(0.4)
# #上述写法的等价写法
# def sleep_04():
#     time.sleep(0.4)
# sleep_04 =timer(0.2)(sleep_04)sleep_04()
print(sleep_04.__name__)

sleep_04 running time is over 0.2 seconds
sleep_04

相关文章:

  • Nacos动态配置实战
  • 【GreenHills】GHS的Run-Time检查功能
  • 深度学习反向传播-过程举例
  • The First项目报告:解读跨链互操作性平台Wormhole
  • unix中的exec族函数介绍
  • 个人获取Wiley 、ScienceDirect、SpringerLink三个数据库文献的方法
  • 支持分页的环形队列
  • 海云安董事长谢朝海博士出席2024年中国国际服务贸易交易会“大模型应用创新论坛”
  • Golang | Leetcode Golang题解之第442题数组中重复的数据
  • Golang | Leetcode Golang题解之第436题寻找右区间
  • 【Golang】关于Go语言字符串转换strconv
  • vue3实现打字机的效果,可以换行
  • 3.整数二分
  • YOLOv9改进策略【注意力机制篇】| 蒙特卡罗注意力(MCAttn)模块,提高小目标的关注度
  • 无人机在农业方面的应用!
  • [case10]使用RSQL实现端到端的动态查询
  • 2017 年终总结 —— 在路上
  • Angularjs之国际化
  • create-react-app项目添加less配置
  • CSS3 变换
  • DOM的那些事
  • Linux中的硬链接与软链接
  • Python语法速览与机器学习开发环境搭建
  • Terraform入门 - 3. 变更基础设施
  • Vim 折腾记
  • vue-cli3搭建项目
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 设计模式走一遍---观察者模式
  • 算法系列——算法入门之递归分而治之思想的实现
  • 探索 JS 中的模块化
  • 项目管理碎碎念系列之一:干系人管理
  • 新版博客前端前瞻
  • ​​​​​​​​​​​​​​Γ函数
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • (20050108)又读《平凡的世界》
  • (C11) 泛型表达式
  • (k8s)kubernetes 部署Promehteus学习之路
  • (NSDate) 时间 (time )比较
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (六)vue-router+UI组件库
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (循环依赖问题)学习spring的第九天
  • (一)面试需要掌握的技巧
  • (原创)可支持最大高度的NestedScrollView
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)http-server应用
  • (转)ORM
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .Net IOC框架入门之一 Unity
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter