从对象的角度看python闭包与装饰器
闭包
理解:主要的两个词:自由变量和函数。一个闭包就是你调用了一个a函数,这个a函数返回了一个b函数给你,这个返回的函数b就叫闭包。在调用函数a的时候传递的参数就是自由变量。
例如:
def func(name):
def inner_func(age):
print(‘name:’,name,’age:’,age)
return inner_func
bb=func(“the5fire”)
bb(26)
这里面调用func的时候就产生了一个闭包,inner_func,并且该闭包持有自由变量name,因此也意味着,当函数func的生命周期结束之后,name这个变量依然存在,他被闭包引用了,所以不会被收回。
目的:帮助我们来完成一个通用的功能。闭包和类相似,都是对数据的封装,但是闭包本身就是个方法。和类一样,编程时会把通用的东西抽象成类,以复用通用的功能。闭包也是一样,当我们需要函数颗粒度的抽象时,闭包就是一个很好的选择。
定义:在函数中可以(嵌套)定义另一个函数时,如果内部函数引用了外部函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。
使用场景:1、闭包和装饰器的嵌套。2、惰性求值(表达式不在它被绑定到变量后就立即求值,而是在该值被取用的时候求值,参考迭代器,range等。python中待求证是否是所有表达式都是如此。)3、需要对某个函数的参数提前赋值的情况(还处于懵逼中,并不理解哪个函数不能提前赋值的。)使用场景来自:https://www.the5fire.com/closure-in-python.html
传参:闭包函数相对于普通函数会多出一个__closure__的属性,里面定义了一个元组用于存放所有的cell对象,每个cell对象一一保存了这个闭包中所有的外部变量。
https://betacat.online/posts/2016-10-23/python-closure/
装饰器
通俗理解:是对函数的一种包装,能使函数的功能得到扩充,而同时不用更改函数的本身的代码,可以增加函数执行前、执行后的行为。
装饰器可以理解为另类的闭包,因为函数结构体是类似的,所以在闭包和装饰器嵌套的时候,比较容易搞混。装饰器的难点并不在于它的目的性,而在它的执行顺序和语法糖规则(不改原函数,不仅包括函数体,还有函数的调用,总之凡是修改了原函数的,那就不是装饰器了)。
http://developer.51cto.com/art/201807/579489.htm
运行时间:装饰器的一个关键特性是,它们在被装饰的函数定义之后立即运行。而被装饰的函数只在明确调用时运行。
使用场景:https://www.jianshu.com/p/3e4000e34bdd
总结:
从对象的角度看闭包和装饰器,需要对闭包和装饰器结合起来,最好理解几个嵌套,这两个点概念会在脑瓜里更清晰。单凭语言介绍是没有多少用的。