zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/bky20061005/p/13088209.html
Copyright © 2011-2022 走看看