近期从网络中看到一张图, 将闭包看为了高大上的技术. 今天就带着大家来熟悉和掌握python中的装饰器如何实现及装饰器的原理

闭包就是能够读取其他函数内部变量的函数。例如在大部分编程语言中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。
在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
一句话说就是,在函数中再嵌套一个函数,并且引用外部函数的变量,这就是一个闭包了。
如下图所示: 在myfunc函数中, 嵌套函数 use_c 即为闭包函数.

结合闭包,就可以实现函数装饰器了。
@语法糖的作用一是:
在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入。
@语法糖的作用二是:
如果被@的函数是一个闭包函数,那么就把被修饰函数的参数传给闭包的内函数,结合位置参数列表args和可变参数字典kwargs,就可以完成所有参数的接收。
案例: 在inner上面添加@outer,是将inter(函数)作为outer的参数传入

上述案例中, 调用inner传入的实参数据(1,2) 会传递给装饰器outer的闭包函数wrapper中的*args作为位置参数.
1.把inner的参数传给wrapper(闭包内函数)
2.使用*args可以接收所有的位置型参数,**kwargs可以接收所有的非必填参数
3.参数类型是以实际传参为准
备注:一定要在闭包的内函数里面调用被装饰函数,否则被装饰函数本身不会执行
装饰器又名(函数/类)装饰器,顾名思义,就是装饰(函数/类)的,用来增强(函数/类)的功能。
案例: 你写了一个函数,计算两个数相加需要的时间

然而:现在主管要你计算减法的时间,当然有可能还要乘法,除法. 怎么办?
你可能会考虑写四个函数,或者改造函数,这样显得很麻烦,也不灵活,万一计算时间的代码有改动,你得每个函数都要改动。
Python提供了更好的办法,就是装饰器

通过@timer装饰器, 修饰 add, sub 函数, 当然乘法, 除法等等都是相同的.
此时, 无论被装饰函数 add sub中的代码有任何改动, 都不影响装饰器自身的运行与计算.
被装饰函数(inner)在哪里执行要看你在哪里调用(只会执行一次)
最先执行的是outer
当outer运行完成后,在return的地方执行了wrapper
以上就是闭包与装饰器的实现及运行原理, 期望能够给大家的理解带来帮助.
最后感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几天时间整理的非常全面的,希望也能帮助到有需要的你!

这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……
如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以点击下方小卡片加入我们群,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。
敲字不易,如果此文章对你有帮助的话,点个赞收个藏来个关注,给作者一个鼓励。也方便你下次能够快速查找。
零基础转行软件测试:38天自学完软件测试,拿到了字节的测试岗offer,堪称B站最好的视频!
自动化测试进阶:已上岸华为,涨薪20K,2022最适合自学的python自动化测试教程,自己花16800买的,无偿分享
