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