Python:闭包函数与装饰器
Python:闭包函数与装饰器
闭包函数:
定义:内层函数对外层函数非全局变量的引用,就叫做闭包函数。
? 闭包会一直存在内存当中,不会因为函数执行结束而被释放。
闭包: 保护数据安全、保护数据干净性。
闭包的目的:要接受被装饰的函数和被装饰函数需要的参数
基本模型:
def wrapper(): name = ‘alex‘ def inner(): print(name) inner() wrapper() alex
判断是否为闭包函数:
可以通过print(函数名.__closure__ )看是否有<cell xxxx xxx >类似信息打印,如果有就说明该函数为闭包函数。
name = ‘harry‘ def wrapper(): def inner(): print(name) inner() print(inner.__closure__) # None 说明该函数不是闭包函数 wrapper() None
name = ‘harry‘ def wrapper(x): x = name def inner(): print(x) inner() print(inner.__closure__) # <cell at 0x0000000000130C48: str object at 0x0000000001E8A260> 有类似的打印信息说明该函数为闭包函数 wrapper(name) harry (<cell at 0x02B77490: str object at 0x00FF73A0>,)
应用场景:
#功能获取网页内容 from urllib.request import urlopen def zhua(url): #url=‘www.baidu.com‘ def get(): return urlopen(url).read() return get f=zhua(‘www.baidu.com‘) f()
总结:一个函数内部如果需要某个名字关系,有两种方法:
1、通过传参的方式
2、通过闭包的方式,在该函数外层包一层作用域(即再定义一个函数),将需要的名字关系包在外部函数中
装饰器:
定义:用来装饰其他函数,装饰器本身可以是任意可调用对象,被装饰的对象也可以是任意可调用对象。装饰器的本质就是闭包
原则:
1、不修改被装饰对象的源代码。
2、不修改被装饰对象的调用方式。
功能:在遵循原则的前提,为被装饰对象添加上新功能。
装饰器的基本模型
def wrapper(f): def inner(*args,**kwargs): """被装饰函数执行之前的操作""" ret = f(*args,**kwargs) """被装饰函数执行之后的操作""" return ret return inner