美文网首页python的基础以及提高
Python day30_闭包与装饰器

Python day30_闭包与装饰器

作者: g_s_007 | 来源:发表于2018-06-07 22:40 被阅读0次

    闭包

    闭包:两个函数的嵌套,外部函数返回内部函数的引用,外部函数一定有参数
    def 外部函数(参数):
        def 内部函数():
            pass
        return 内部函数
    
    他跟函数之间的区别:
            1.格式两个函数嵌套
            2.闭包外部函数的参数可以在内存中保持
    

    装饰器

    装饰器是什么:闭包加@xxx
    装饰器的作用:在不改变原先的函数值跟调用的方式,添加额外的功能
    装饰器的代码:
        def set_fun(func):
            def call_fun(*args,**kwargs):
                return func(*args,**kwargs)
    
            return call_fun
    
        @set_fun    
        def test():
            pass
    

    装饰器结论:

    1.装饰前的函数test,是由func指向的
    2.装饰后的函数test,实际是call_fun
    3.装饰前的test,call_fun,func三者参数一致
    4.装饰器不能去改变函数的调用方式跟返回值(道德)
    

    一个装饰器一个函数了解

    1.png

    二个装饰器装饰一个函数图解大法

    2 - Copy.png

    二个装饰器装饰器一个函数内存图了解

    3.png

    装饰器传参

    在闭包外层再套一层,返回闭包的引用
    def set_args(args):
        def set_fun(func):
            def call_fun(*args,**kwargs):
                return func(*args,**kwargs)
            return call_fun 
        return set_fun
    
    @set_args("xx")  #这个要分两步执行,第一步执行set_args("xx")函数得到一个闭包的最外层的引用,第二步去@闭包的最外层引用去执行原先的装饰器过程
    def test():
        print("test")  
    

    应用:

    计算某函数的执行次数,用户行为分析

    from time import sleep,ctime
    
    def set_fun(func):
        count = 0
        def call_fun(*args,**kwargs):
            nonlocal count
            func()
            count += 1
            print( '调用的次数为:%s'% count)
            # return '调用的次数为:%s'% count
        return call_fun
    
    @set_fun
    def test():
        print('test')
    
    test()
    sleep(1)
    test()
    
    @set_fun
    def test1():
        print('test')
    
    test1()
    sleep(1)
    test1()
    

    扩展:

    python一切皆对象

    https://blog.csdn.net/LRLZ_Python/article/details/49893103      
    

    相关文章

      网友评论

        本文标题:Python day30_闭包与装饰器

        本文链接:https://www.haomeiwen.com/subject/xgmnsftx.html