• 二十二、闭包和装饰器


    一、闭包的概念
    '''

    1.什么是闭包
    闭包其实就是一个函数
    2.如何创建闭包
    a.要有函数的嵌套(外部函数、内部函数)
    b.内部函数中要使用外部函数的变量
    c.外部函数必须有返回值,返回内部函数名
    3.如何使用闭包
    f=funOut(100) #调用外部函数,用f变量指向内部函数
    print(type(f))
    result=f(200) #通过变量调用函数
    '''

    #使用闭包,完成求两个数的和
    def sum(a,b):
    return a+b

    def funOut(num1):
    def funIn(num2):
    #内部函数修改外部函数的变量
    nonlocal num1 ----可以调用,但是修改的话,要用nonlocal
    num1+=100
    return num2+num1
    return funIn

    funIn=funOut(100)
    print(type(funIn))
    result=funIn(200)
    print('两个数的和:',result)
    二、闭包的特殊用途
    #闭包的特殊用途:不修改源代码的前提下,添加新的功能
    #添加日志输出信息
    import time
    def writeLog(func):
    try:
    file=open('wirteLog.txt','a',encoding='utf-8')
    #向文件中写入日志信息(访问:方法名 时间:XXXX-XX-XX)
    file.write('访问:')
    file.write(func.__name__)
    file.write(' ')
    file.write('时间:')
    file.write(time.asctime())
    file.write(' ')
    except Exception as e:
    print(e.args)
    finally:
    file.close()
    def fun1(): #修改了源代码的方式,系统很复杂,可能很多人在调用这个函数,结果你为了自己方便,改了函数,是不可取的
    # writeLog(fun1)
    print('功能1')
    def fun2():
    # writeLog(fun2)
    print('功能2')

    #使用闭包,不修改fun1 和fun2的功能代码,添加日志信息
    def funcOut(func):
    def funcIn():
    writeLog(func)
    func()
    print('调用',func.__name__,'结束')
    return funcIn

    fun1=funcOut(fun1)
    fun1()
    fun2=funcOut(fun2)
    fun2()
    三、装饰器
    闭包是为学习装饰器做铺垫,在 python 程序中,装饰器就是一种闭包,它可以是闭包的访问方式更简单。在 Python 中使用装饰器,需要使用一个特殊的符号“@”来实现。在定义装饰器函数
    或类时,使用“@装饰器名称”的形式将符号“@”放在函数或类的定义行之前。在调用的时候,和闭包是相同的,但是可以简化闭包的调用。
    #使用装饰器 完成不修改fun1() fun2()函数的源码,添加输出日志信息
    import time
    def writeLog(func):
    try:
    file=open('log.txt','a',encoding='utf-8')
    file.write('访问:')
    file.write(func.__name__)
    file.write(' ')
    file.write('时间:')
    file.write(time.asctime())
    file.write(' ')
    except Exception as e:
    print(e.args)
    finally:
    file.close()

    #使用闭包
    def funcOut(func):
    def funcIn():
    writeLog(func)
    func()
    return funcIn
    #闭包的调用

    @funcOut #fun1=funcOut(fun1) 相当于这里是闭包的调用,简化了闭包的调用
    def fun1():
    print('功能1')

    @funcOut
    def fun2():
    print('功能2')
    fun1()
    fun2()
  • 相关阅读:
    property补充
    利用描述符自定制property
    类的装饰器
    上下文协议管理
    描述符
    迭代器协议
    doc属性__module__属性__del__(垃圾回收)__call__方法
    【移动支付】.NET支付宝App支付接入
    【WPF】PopupColorEdit 的使用
    【MVVM Dev】PART_Editor的使用
  • 原文地址:https://www.cnblogs.com/dangjingwei/p/12766022.html
走看看 - 开发者的网上家园