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号探月工程一样。需要多积累和练习!