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

python装饰器wrappe_Python进阶-III 函数装饰器(Wrapper)

1、引入场景:

检查代码的运行时间

importtimedeffunc():

start=time.time()

time.sleep(0.12)print('看看我运行了多长时间!')

end=time.time()print('此段代码运行时长为:%s'%(end -start))

func()

如果有大量的函数要检查,这样加入代码太费功夫!考虑提取为一个函数,要检查时直接调用即可

defcheck_time(f):

start=time.time()

time.sleep(0.12)

f()

end=time.time()print('此段代码运行时长为:%s' % (end -start))

check_time(func)

还是有问题,有人嫌每次都去调用该函数很麻烦!

能不能,在不修改要测试远行时长的函数的调用方式前提下,还想在原来的函数前后添加测试时长功能?

def timing(f): #装饰器函数

definner():

start=time.time()

time.sleep(0.12)

f()#被装饰函数

end =time.time()print('此段代码运行时长为:%s' % (end -start))returninner

func=timing(func)

func()

这里就可以定义装饰器函数了,用来装饰其他函数,添加相关功能的函数叫装饰器函数

2、语法糖的使用

@timing #@装饰器函数名 相当于前面函数调用前的赋值:func_to = timing(func_to)

def func_to(): #被装饰的函数

a = 1000000b= 1223434

return a *b

func_to()

3、装饰器的作用

不想修改函数的调用方式 但是还想在原来的函数前后添加功能

上面的例子中timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用

4、装饰带参数的函数

deftiming_arg(f):definner(a):

start=time.time()

re=f(a)

end=time.time()print('此段代码运行时长为:%s' % (end -start))returnrereturninner

@timing_argdeffunc_have_arg(a):

result= a * 10000000

return result

5、装饰带可变参数的函数

1 def wrapper(f): #装饰器函数,f是被装饰的函数

2 def inner(*args, **kwargs):3 '''在被装饰函数之前要做的事'''

4 ret = f(*args, **kwargs) #被装饰的函数

5 '''在被装饰函数之后要做的事'''

6 returnret7

8 returninner9

10 @wrapper #语法糖 @装饰器函数名

11 def func_101(a, b): #被装饰的函数

12 time.sleep(0.01)13 print('老板好同事好大家好', a, b)14 return '新年好'

15

16 print(func_101(100, b=200))

6、编程原则: 开放封闭原则#

开放 : 对扩展是开放的

封闭 : 对修改是封闭的

相关文章:

  • java 传绝对路径无效_java架构师系列1-数据结构(2)数组
  • ros 机械臂复位_DYNAMIXEL PRO PH54-200-S500-R 开源机械臂
  • pb数据窗char只有255_MySQL的基本数据类型
  • c语言 malloc_研究了多年C语言,却还没有搞懂malloc和free
  • 从零开始学python数据分析 电子版_从零开始学Python数据分析与挖掘[PDF][67.81MB]
  • 蓝桥杯c语言难还是JAVA难_校园人物 | 用C语言谱写别样人生——记校“十佳青年”数大学院孙露明...
  • mfc倾斜文本输入_一文解读光学字符识别(OCR)与手写文本识别(HTR)
  • python三大神器_Python三神器之virtualenv、virtualenvwrapper
  • 单学python能找工作吗_我为什么推荐学Python,但不希望大家用Python找工作?
  • python整数类型进制表示_Python数据类型:bytes
  • scada schneider 系统_【原创分享】小白也能DIY物联网系统,程序设计来了!
  • python程序设计试卷_Python程序设计试题库
  • python nameerror错误_python - python regex错误:NameError:未定义名称“ re” - 堆栈内存溢出...
  • 用自底向上算法为一组整数构造一个大根堆。_Polyhedral编译调度算法(1)——Pluto算法...
  • ftp文件夹错误 windows无法访问此文件夹_ftp根目录怎么设置,ftp根目录怎么设置,详细设置方法...
  • “大数据应用场景”之隔壁老王(连载四)
  • Android系统模拟器绘制实现概述
  • canvas 五子棋游戏
  • httpie使用详解
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript设计模式与开发实践系列之策略模式
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • php面试题 汇集2
  • rabbitmq延迟消息示例
  • vue总结
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 给新手的新浪微博 SDK 集成教程【一】
  • 手写一个CommonJS打包工具(一)
  • 新版博客前端前瞻
  • 用Canvas画一棵二叉树
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 通过调用文摘列表API获取文摘
  • ​你们这样子,耽误我的工作进度怎么办?
  • #pragma data_seg 共享数据区(转)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (14)Hive调优——合并小文件
  • (26)4.7 字符函数和字符串函数
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (四)c52学习之旅-流水LED灯
  • (一)u-boot-nand.bin的下载
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *Django中的Ajax 纯js的书写样式1
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 调用php,php 调用.net com组件 --
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .Net中间语言BeforeFieldInit
  • .net专家(高海东的专栏)
  • @ModelAttribute注解使用
  • [1]-基于图搜索的路径规划基础