python有参装饰器详解_不懂装饰器如何使用,敢说会python编程?详解装饰器的本质与妙用...

为什么必须要会python的装饰器

python是一种动态语言,语法非常灵活;对于python新手来说,常常会被各种简化的写法搞得一头雾水。但对于高手来说,这些灵活简便的写法则是他们的编程利器。其中python提供的装饰器可谓是将python灵活的语法发挥到了极致。

python的功底够不够,问问python装饰器了解到什么程度就知道了,所以关于python装饰器是我面试候选人必问的问题之一。同时也可以看到,它是所有python教程中必有的知识点之一。

不仅仅是为了应付面试,装饰器在实际工作中也是大有用途的,尤其是在大型项目以及各种框架中,应用非常广泛,不懂装饰器的语法就很难读懂和维护高质量python项目,更不用提自己独立开发高质量的大型项目了;

开始讲python装饰器

python装饰器的语法看起来可能有点“诡异”;但只要明白了其本质,再看语法格式就很通俗易懂了。

从语法角度来讲,python装饰器就是将一个函数映射为另一个函数,简单点来说,就是有一个函数(称为装饰器),输入是一个函数并返回另一个函数,我们看下面的例子:

aa18972bd40735fa12a448134147d3b50e2408e5.png?token=3c4371c31c2f5a9728695610d1280867最简易的装饰器实现

输入一个函数fun,返回的是fun_wrapper函数;

这个装饰器的使用很简单,代码示例如下:

@time_duationdef sleep_1s():time.sleep(1)return 0

通过以上例子,应该可以明白装饰器的本质,就是将一个函数映射为另一个函数,在这个基础之上,再阅读下面的高级用法会比较简单。

进阶一

上面的例子中,被装饰的函数sleep_1s是没有参数的,假如一个函数有参数,如何解决函数传参的问题?

实现起来也很简单,在定义装饰器的返回函数时,使用通用的参数作为函数输入,并且将这些参数传入到被装饰的函数中即可;

示例代码如下:

503d269759ee3d6d26b0b4a79c00b1244f4ade01.png?token=e0857b89044931d21b9dd2b0a3294186装饰带参数的函数

进阶二

下面来看更高级一点的,装饰器本身有参数,如何解决?

就上面的例子而言,对于函数调用,如果每次都记录耗时的话,则对系统整体性能损耗较大,所以可以随机采样记录函数的耗时,并且可以指定采样的比例,如何定义这样一个装饰器?代码如下:

77c6a7efce1b9d16c72736362cc868898d5464a6.png?token=39676d380168e284b8b7a58c17d13c47带有参数的装饰器

解释一下上面的代码:

这个代码可以认为是定义了一个普通函数,这个函数返回的时一个装饰器,如果我们抛开第一层函数time_duation,直看里面的两个函数,是不是一个装饰器?对吧;

唯一需要注意的是@wraps(fun) 这行代码需要加上就好;

带参数的装饰器使用如下:

@time_duation(sample_rate=0.5)def sleep_1s(duation=1):time.sleep(duation)

一定要以函数的方式注解,也就是后面必须有括号,即便括号内不写参数;

进阶三

下面看类装饰器

bf096b63f6246b6079919fea34eec64a500fa2aa.png?token=0e029eed6fc4f19d14ab97545cf72e88类装饰器

装饰器的作用

从设计层面来说,装饰器跟AOP很像,可以将通用的功能剥离出来,并且方便的织入业务逻辑中;(简言之就是为函数功能扩展提供了一种便捷的方式)

从编码层面来说,提供了可以很灵活的实现组合

应用场景

方法执行耗时统计

函数入参、结果的日志记录

参数校验

缓存等

你还了解关于装饰器的其他的哪些应用场景?欢迎留言评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值