Python  装饰器

  在实际的工作中,经常碰到领导或产品经理会提出很多甚至(变态)的产品要求,作为python开发,好不容易完成领导的需求,做出一个产品,并且经过测试成功上线。突然有一天,产品经理要求你在这个已经上线的产品中添加一些功能!这个时候就需要做到如何保证原有的代码不做轻易改动,并还能加进去新的代码来实现功能?

  在python中,给原有代码添加功能,有非常明确的方法-----装饰器

首先装饰器是什么?

  网上有装饰器的官方解释,这里博主不讨论概念,简单理解的说:装饰器本质是函数(器),它的主要作用就是为其他函数添加附加的功能

装饰器的原则?

  1.不能修改被装饰函数的源代码

  2.不能修改被装饰函数的调用方式

学习装饰器,必须要知道和熟悉的知识储备

  1.函数即变量:在python中,函数可以运用变量来表示

  2.高阶函数

  3.嵌套函数

装饰器的结构: 高阶函数+嵌套函数=装饰器



                                                                    实践是掌握的最好办法

  举例:假设我们产品代码里有两个函数时,我们需要对这两个函数添加一个功能:显示这两个函数的运行时间

1,源代码是这样:如图,架设源代码是这样的,并且打印的方式也是非常简单的打印

2,根据修改要求,这个时候会人有说,在原有函数里修改每一个函数内容做修改不就可以了?是,在原有的代码里修改来完成打印出运行时间,完全可以。但是,如果是大的生产环境下,大部分上线的产品里的函数不会这么简单,就算是你修改函数并成功,先不说实际中一个产品函数有多少,你要做多少重复性工作!万一还有人在调用这个产品里的函数,这个时候你修改了,就很容易造成他人调用出问题,,,,那你离开除就不远了(下图是修改源代码,不推荐使用)

3,如果因实际环境不能在原有的代码里做修改,那么只能做添加,这里就涉及到装饰器的应用

首先我们先加入装饰器

如上图:这里的 timer 是装饰器  test1,test2是源代码函数(这里为了方便显示,加了睡眠时间3秒,可以不加),从图中可以看出,装饰器的加入,不仅添加了两个函数的功能,还没有改变函数的调用方式,完成了要求

4,分析一下装饰器

如图:

根据文章开头概念:装饰器=高阶函数+嵌套函数

图上首先调用了一个time库,并很明确可以看出 timer 函数里嵌套了 d 函数 并return d 函数。该函数体里的内容是最终的时间减去了开始运行的时间。乍一看没什么问题,都很好理解;注意:还有一个 f() 没有说,f()  是什么?,为啥它在start_time 和 stop_time中间?

看下图:

其实 f() 是该程序运行中,代表了两个函数,每一个函数调用都要经过 f() 并被调用,简单来说,f()代表两个函数,所以,我们称之为高阶函数

5,运行看看效果

如图:

可以看出每一个函数运行后,都有显示时间,完成了要求


总    结

  装饰器的应用,非常适合工作中遇到修改代码问题的解决,并且灵活的不改变源代码的情况下完成添加功能,可以说是“优雅”的。python里还有很多方法非常有意思,这需要我们不断的去探索,去挖掘。由浅入深,一步步来,就像嫦娥5号探月工程一样。需要多积累和练习!

  

最新文章

  1. 创建 VXLAN - 每天5分钟玩转 OpenStack(111)
  2. windows下部署mongodb
  3. C#开发中Windows域认证登录2016(扩展吉日嘎拉GPM系统V4.2)
  4. Eclipse中10个最有用的快捷键组合(转)
  5. Codevs 1669 运输装备
  6. 【设计模式 - 11】之享元模式(FlyWeight)
  7. Spring 中的注解
  8. MVC3 Razor 根据不同页面使用不同Layout
  9. for循环去重排序
  10. 推荐一个利用 python 生成 pptx 分析报告的工具包:reportgen
  11. 稀疏矩阵 part 2
  12. javascript 高级程序设计 一
  13. 【Spring】Spring框架如何集成Hibernate框架
  14. 重磅来袭,开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载(转)
  15. mysql_real_escape_string与mysqli_real_escape_string
  16. impdp导入expdp导出数据库实例
  17. 利用Windows 2003系统中实现两个网段的路由
  18. Zabbix 监控 Cisco ASA5525 流量
  19. Flask 的系统学习
  20. Kotlin的Reified类型:怎样在函数内使用这一类型(KAD 14)

热门文章

  1. 【C学习笔记】day3-2 计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值。
  2. WPF 实现文件、图标拖放功能(支持UAC的那种)
  3. PHP二维数组根据某个元素(key)排序
  4. iOS系统自带的扫码功能(二维码+条形码+识别本地图片)
  5. return chain.filter(exchange); 这句啥意思
  6. 前端导出文件流[object Object]
  7. VS2019使用Qt4.8.7
  8. satpy 处理卫星 FY4A 数据
  9. html的table多级表头表格的代码
  10. 关闭内核Debug_log打印!