我是靠谱客的博主 默默火车,最近开发中收集的这篇文章主要介绍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很像,可以将通用的功能剥离出来,并且方便的织入业务逻辑中;(简言之就是为函数功能扩展提供了一种便捷的方式)

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

应用场景

方法执行耗时统计

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

参数校验

缓存等

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

最后

以上就是默默火车为你收集整理的python有参装饰器详解_不懂装饰器如何使用,敢说会python编程?详解装饰器的本质与妙用...的全部内容,希望文章能够帮你解决python有参装饰器详解_不懂装饰器如何使用,敢说会python编程?详解装饰器的本质与妙用...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部