Python装饰器-闭包与函数装饰器

在学习装饰器前,需要先了解闭包的概念。形成闭包的要点:,下面以一个计算列表平均值的案例来讲解闭包:,运行结果如下:当传入的数值为20时,列表中只有一个数,所以计算结果是20;当再传入一个数值30时,此时列表中就有两个数20和30,所以平均值的计算结果是25.,Python装饰器-闭包与函数装饰器,例如,有以下两个函数,分别计算两个数的和以及成绩:,现在有个需求:我想要在每个函数的计算开始前打印“开始计算…”,在计算结束后打印“计算结束…”。我们可以通过直接修改函数代码的方式来满足这个需求,但这样会面临以下问题:,所以,上述直接修改函数代码的方式不可行。我们希望在不修改原函数的情况下,实现对函数的扩展。例如:,执行结果如下:,Python装饰器-闭包与函数装饰器,这种新创建一个函数的方式虽然没有修改原函数,但面临一个很严重的问题:,只能扩展指定函数,不能通用于其它函数,例如扩展上述的add函数,而不能扩展mul函数,如果想要扩展mul函数,只能再创建一个扩展函数;,因为,我们希望可以定义一个通用的扩展函数,可以作用域所有函数。这类不改变原函数代码的通用函数就是:装饰器。,装饰器本质上是一个python函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,也就是为已经存在的对象添加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。,例如:,运行结果如下:,Python装饰器-闭包与函数装饰器,可见,在没有改变原函数代码的情况下,即给原函数增加了一些额外的功能,func是要修饰的函数,作为一个变量传入装饰函数,能够通用于其他函数,这个wrapper_info就是装饰器。但目前面临的问题是,被装饰函数如果带参数怎么办?例如:,尽管可以在装饰器wrapper_info中传入name、age,但并不是每个被装饰的函数都只有name、age,亦或是指定类型的参数,还有可能传入的是字典、列表、元组等。也就是传入参数的类型和数量不固定怎么办?,此时就需要用到不定长参数:(*args, **kwargs),例如:,运行结果如下:,Python装饰器-闭包与函数装饰器,上述提到的是装饰器,一种是应用于被装饰的函数不带参数,一种是被装饰的函数带参数,那装饰器本身能否带参数呢?比如我定义一个变量,想通过传入不同的值来控制这个装饰器实现不同的功能。答案是肯定的,例如:,运行结果如下:,Python装饰器-闭包与函数装饰器,如果是装饰器函数带参数,则调用方式为:,即在被装饰函数上方以@符号进行修饰,如果是装饰器函数带参数,例如上述的use_log,则需要在装饰器中传入参数:,在不改变原函数代码的情况下,给原函数增加了一些额外的功能,并且能够通用于其他函数,这样的函数就称作为装饰器。,可以通过传统调用函数的方式进行调用,也可以通过@装饰器的方式调用

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/20163.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34