• 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
    
  • 相关阅读:
    15、事例十五:纹理映射
    14、事例十四:材质:十二个材质球
    [luogu]P1084 疫情控制
    [luogu]P2502 [HAOI2006]旅行
    [luogu]P2053 [SCOI2007]修车
    线性相关/线性基
    [luogu]P3629 [APIO2010]巡逻
    [luogu]P3623 [APIO2008]免费道路
    权值线段树
    树链剖分
  • 原文地址:https://www.cnblogs.com/bky20061005/p/13088209.html
Copyright © 2020-2023  润新知