zoukankan      html  css  js  c++  java
  • Python9-装饰器进阶-day12

    wapers方法

    def wahaha():
        '''
        sljfldsjflds
        :return:
        '''
        print('娃哈哈')
    print(wahaha.__name__)  #查看字符串格式的函数名
    from functools import wraps
    def wrapper(func):  #func = login
        @wraps(func)
        def innner(*args,**kwargs):
            print('在被装饰的函数执行前做的事')
            ret = func(*args,**kwargs)
            print('在被装饰的函数执行后做的事')
            return ret
        return innner
    @wrapper      #login = wrapper(login)
    def login(day):
        '''这是一个放假通知'''
        print('全体放假%s'%day)
        return '好开心'
    print(login.__name__)
    print(login.__doc__)
    ret = login(3)   #inner
    print(ret)

    login
    这是一个放假通知
    在被装饰的函数执行前做的事
    全体放假3
    在被装饰的函数执行后做的事
    好开心

     装饰器进阶_带参数的装饰器

    import time
    FLAG = True
    def timmer_out(FLAG):
        def timmer(func):
            def inner(*args,**kwargs):
                if FLAG:
                    start = time.time()
                    ret = func(*args,**kwargs)
                    end = time.time()
                    print(end - start)
                    return ret
                else:
                    ret = func(*args,**kwargs)
                    return ret
            return inner
        return timmer
    @timmer_out(FLAG)
    def wahaha():
        time.sleep(0.1)
        print('hahahahahaha')
    #@timer = timer_out(FLAG)
    @timmer_out(FLAG)
    def erguotou():
        time.sleep(0.2)
        print('erguotoutotutou')
    
    wahaha()
    erguotou()

    hahahahahaha
    0.1000058650970459
    erguotoutotutou
    0.2000112533569336

     
    import time
    FLAG = False
    def timmer_out(FLAG):
        def timmer(func):
            def inner(*args,**kwargs):
                if FLAG:
                    start = time.time()
                    ret = func(*args,**kwargs)
                    end = time.time()
                    print(end - start)
                    return ret
                else:
                    ret = func(*args,**kwargs)
                    return ret
            return inner
        return timmer
    @timmer_out(FLAG)
    def wahaha():
        time.sleep(0.1)
        print('hahahahahaha')
    #@timer = timer_out(FLAG)
    @timmer_out(FLAG)
    def erguotou():
        time.sleep(0.2)
        print('erguotoutotutou')
    
    wahaha()
    erguotou()
    
    
    hahahahahaha
    erguotoutotutou

    #多个装饰器装饰一个函数

    def wrapper1(func):
        def innner1(*args,**kwargs):
            print('wrapper,before func')
            func()
            print('wrapper,after func')
        return innner1
    def wrapper2(func):
        def innner2(*args,**kwargs):
            print('wrapper,before func')
            func()
            print('wrapper,after func')
        return innner2
    @wrapper2
    @wrapper1
    def f():
        print('##########333')
    f()
    
    
    wrapper,before func
    wrapper,before func
    ##########333
    wrapper,after func
    wrapper,after func
    ####################################
    from functools import wraps
    def wrapper1(func): #func --->f
    def innner1(*args,**kwargs):
    print('wrapper1,before func')
    func() #f
    print('wrapper1,after func')
    return innner1
    def wrapper2(func): #func --->inner1
    def innner2(*args,**kwargs):
    print('wrapper2,before func')
    func() #inner1
    print('wrapper2,after func')
    return innner2
    @wrapper2 #f=wrapper2(f) === wrapper(inner1) ===inner2
    @wrapper1 #f=wrapper1(f) ==inner1 函数最近的装饰器先执行
    def f():
    print('##########333')
    f() #-----》inner2()
     

     

     三层嵌套

    from functools import wraps
    def wrapper1(func):  #func --->f
        def innner1(*args,**kwargs):
            print('wrapper1,before func')
            func()   #f
            print('wrapper1,after func')
        return innner1
    def wrapper2(func):   #func --->inner1
        def innner2(*args,**kwargs):
            print('wrapper2,before func')
            func()   #inner1
            print('wrapper2,after func')
        return innner2
    def wrapper3(func):   #func --->inner1
        def innner3(*args,**kwargs):
            print('wrapper3,before func')
            func()   #inner1
            print('wrapper3,after func')
        return innner3
    @wrapper3
    @wrapper2    #f=wrapper2(f)  === wrapper(inner1)  ===inner2
    @wrapper1   #f=wrapper1(f)  ==inner1   函数最近的装饰器先执行
    def f():
        print('##########333')
    f()    #-----》inner2()
    
    
    wrapper3,before func
    wrapper2,before func
    wrapper1,before func
    ##########333
    wrapper1,after func
    wrapper2,after func
    wrapper3,after func

     带返回值的多装饰器装饰函数

    def wrapper1(func):  #func --->f
        def innner1(*args,**kwargs):
            print('wrapper1,before func')
            ret = func()   #f
            print('wrapper1,after func')
            return ret
        return innner1
    def wrapper2(func):   #func --->inner1
        def innner2(*args,**kwargs):
            print('wrapper2,before func')
            ret = func()   #inner1
            print('wrapper2,after func')
            return ret
        return innner2
    def wrapper3(func):   #func --->inner1
        def innner3(*args,**kwargs):
            print('wrapper3,before func')
            ret = func()   #inner1
            print('wrapper3,after func')
            return ret
        return innner3
    @wrapper3
    @wrapper2    #f=wrapper2(f)  === wrapper(inner1)  ===inner2
    @wrapper1   #f=wrapper1(f)  ==inner1   函数最近的装饰器先执行
    def f():
        print('##########333')
        return 'hahahah'
    print(f())   #-----》inner2()

    wrapper3,before func
    wrapper2,before func
    wrapper1,before func
    ##########333
    wrapper1,after func
    wrapper2,after func
    wrapper3,after func
    hahahah

     
  • 相关阅读:
    9.3 寻找magic index
    编写一个函数,确定需要改变几个位,才能将整数A转成整数B。
    打印0-1之间double数字的二进制表示
    打印二叉树节点数值总和等于某个给定节点的所有路径
    判断T2是否是T1的子树
    二棵树某两个节点的公共祖先。
    4.6 找出二叉树中指定节点的下一个节点(中序后继),假定每个节点有父指针。
    队列实现max操作,要求尽量提高效率。
    用两个stack设计一个队列
    转分享一个MAC下绕开百度网盘限速下载的方法,三步操作永久生效
  • 原文地址:https://www.cnblogs.com/zhangtengccie/p/10322880.html
Copyright © 2011-2022 走看看