近期从网络中看到一张图, 将闭包看为了高大上的技术. 今天就带着大家来熟悉和掌握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
以上就是闭包与装饰器的实现及运行原理, 期望能够给大家的理解带来帮助.