标签:两种方法 通过 说明 操作 code one urllib 新功能 总结
定义:内层函数对外层函数非全局变量的引用,就叫做闭包函数。
? 闭包会一直存在内存当中,不会因为函数执行结束而被释放。
闭包: 保护数据安全、保护数据干净性。
闭包的目的:要接受被装饰的函数和被装饰函数需要的参数
基本模型:
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
标签:两种方法 通过 说明 操作 code one urllib 新功能 总结
原文地址:https://www.cnblogs.com/bky20061005/p/13088209.html