一文带你迅速掌握python装饰器

近期从网络中看到一张图, 将闭包看为了高大上的技术. 今天就带着大家来熟悉和掌握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

以上就是闭包与装饰器的实现及运行原理, 期望能够给大家的理解带来帮助.

猜你喜欢

转载自blog.csdn.net/nhb687095/article/details/131828941