函数闭包及装饰器

函数闭包

什么是闭包?

内部函数外部函数作用域里对象的引用(非全局变量),则称内部函数为闭包

一个闭包就是你调用了外部函数,外部函数返回内部函数,此时的内部函数就叫做闭包函数

闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例

闭包简单示例:

通过这个例子大家可以看到,在外部函数中,本应该在wai函数执行完死掉的变量a,由于此时有了 内部函数的引用,从而使得这个变量并不会死去,而是类似于继承一样,通过nei函数又存活了下来

接着让我们愉快的看下一个例子,继续理解闭包

三次闭包函数的执行结果,我们来看一下吧

分析一下,这里出现的结果

首先三次值都是在全局变量num的基础上做累加a的操作

说明在闭包函数对象res存活期间,a变量将会一直存活

最后我们以将一个可变数据对象作为闭包引用的变量为例

执行的结果

闭包思考

闭包私有化了变量,实现了类似于面向对象中实例的功能

由于闭包引用了外部函数的局部变量,则外部函数中的局部变量没有及时释放,消耗内存

在python中,使用闭包的另一个场景就是装饰器,也叫语法糖@

实现闭包

函数嵌套

内部函数对外部函数作用域里对象的引用

外部函数返回内部函数对象

装饰器函数

装饰器:在函数运行时增加功能且不影响这个函数原有内容

普通装饰器函数

语法:

@符号为装饰器函数语法,也常叫做语法糖

先来看一个简单的装饰器函数实现:

执行后的结果:

此时的foo函数在原有的基础上,额外多了装饰器函数中的定义的功能

被装饰函数foo在调用时,其实本质上是在进行wai(foo)()

wai(foo)()过程解析:

装饰器函数wai接收被装饰函数foo作为参数

返回return nei,闭包函数nei被返回

nei()函数调用

由于nei函数的返回值为return func(),所以在内函数调用结束时,被装饰函数也会被调用

被装饰函数在调用时,被调用的函数有三个

wai() nei()以及被装饰函数func()

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180205G0J5VT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券