概述
为什么必须要会python的装饰器
python是一种动态语言,语法非常灵活;对于python新手来说,常常会被各种简化的写法搞得一头雾水。但对于高手来说,这些灵活简便的写法则是他们的编程利器。其中python提供的装饰器可谓是将python灵活的语法发挥到了极致。
python的功底够不够,问问python装饰器了解到什么程度就知道了,所以关于python装饰器是我面试候选人必问的问题之一。同时也可以看到,它是所有python教程中必有的知识点之一。
不仅仅是为了应付面试,装饰器在实际工作中也是大有用途的,尤其是在大型项目以及各种框架中,应用非常广泛,不懂装饰器的语法就很难读懂和维护高质量python项目,更不用提自己独立开发高质量的大型项目了;
开始讲python装饰器
python装饰器的语法看起来可能有点“诡异”;但只要明白了其本质,再看语法格式就很通俗易懂了。
从语法角度来讲,python装饰器就是将一个函数映射为另一个函数,简单点来说,就是有一个函数(称为装饰器),输入是一个函数并返回另一个函数,我们看下面的例子:
最简易的装饰器实现
输入一个函数fun,返回的是fun_wrapper函数;
这个装饰器的使用很简单,代码示例如下:
@time_duationdef sleep_1s():time.sleep(1)return 0
通过以上例子,应该可以明白装饰器的本质,就是将一个函数映射为另一个函数,在这个基础之上,再阅读下面的高级用法会比较简单。
进阶一
上面的例子中,被装饰的函数sleep_1s是没有参数的,假如一个函数有参数,如何解决函数传参的问题?
实现起来也很简单,在定义装饰器的返回函数时,使用通用的参数作为函数输入,并且将这些参数传入到被装饰的函数中即可;
示例代码如下:
装饰带参数的函数
进阶二
下面来看更高级一点的,装饰器本身有参数,如何解决?
就上面的例子而言,对于函数调用,如果每次都记录耗时的话,则对系统整体性能损耗较大,所以可以随机采样记录函数的耗时,并且可以指定采样的比例,如何定义这样一个装饰器?代码如下:
带有参数的装饰器
解释一下上面的代码:
这个代码可以认为是定义了一个普通函数,这个函数返回的时一个装饰器,如果我们抛开第一层函数time_duation,直看里面的两个函数,是不是一个装饰器?对吧;
唯一需要注意的是@wraps(fun) 这行代码需要加上就好;
带参数的装饰器使用如下:
@time_duation(sample_rate=0.5)def sleep_1s(duation=1):time.sleep(duation)
一定要以函数的方式注解,也就是后面必须有括号,即便括号内不写参数;
进阶三
下面看类装饰器
类装饰器
装饰器的作用
从设计层面来说,装饰器跟AOP很像,可以将通用的功能剥离出来,并且方便的织入业务逻辑中;(简言之就是为函数功能扩展提供了一种便捷的方式)
从编码层面来说,提供了可以很灵活的实现组合
应用场景
方法执行耗时统计
函数入参、结果的日志记录
参数校验
缓存等
你还了解关于装饰器的其他的哪些应用场景?欢迎留言评论
最后
以上就是默默火车为你收集整理的python有参装饰器详解_不懂装饰器如何使用,敢说会python编程?详解装饰器的本质与妙用...的全部内容,希望文章能够帮你解决python有参装饰器详解_不懂装饰器如何使用,敢说会python编程?详解装饰器的本质与妙用...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复