• python 装饰函数


    装饰器的作用 —— 不想修改函数的调用方式 但是还想在原来的函数前后添加功能
    原则: 开放封闭原则  
    开放 : 对扩展是开放的
    封闭 : 对修改是封闭的

    # timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用
     1 import time
     2 def timmer(f):    #装饰器函数
     3     def inner():
     4         start = time.time()
     5         f()       #被装饰的函数
     6         end = time.time()
     7         print(end - start)
     8     return inner
     9 
    10 @timmer         #语法糖 @装饰器函数名
    11 def func():     #被装饰的函数
    12     time.sleep(0.01)
    13     print('老板好同事好大家好')
    14     return '新年好'
    15  #inner
    16 #func = timmer(func)
    17 ret = func()   #inner()
    18 print(ret)
    装饰带参数函数的装饰器
    def timmer(f):    #装饰器函数
        def inner(*args,**kwargs):
            #(1,2) /(1)
            start = time.time()
            ret = f(*args,**kwargs)  #f(1,2)       #被装饰的函数
            end = time.time()
            print(end - start)
            return ret
        return inner
    
    @timmer         #语法糖 @装饰器函数名
    def func(a,b):     #被装饰的函数
        time.sleep(0.01)
        print('老板好同事好大家好',a,b)
        return '新年好'
    装饰器的固定模式
    def wrapper(f):    #装饰器函数,f是被装饰的函数
        def inner(*args,**kwargs):
            '''在被装饰函数之前要做的事'''
            ret = f(*args,**kwargs)    #被装饰的函数
            '''在被装饰函数之后要做的事'''
            return ret
        return inner
    
    @wrapper         #语法糖 @装饰器函数名
    def func(a,b):     #被装饰的函数
        time.sleep(0.01)
        print('老板好同事好大家好',a,b)
        return '新年好'  
    装饰器进阶 
    带参数的装饰器
    #500个函数统一
    import time FLAG=False def time_out(FLAGE): def timmer(f): #装饰器函数 def inner(*args,**kwargs): #(1,2) /(1) if FLAGE: start = time.time() ret = f(*args,**kwargs) #f(1,2) #被装饰的函数 end = time.time() print(end - start) return ret else: ret = f(*args, **kwargs) # f(1,2) return ret return inner return timmer @time_out(FLAG) #语法糖 @装饰器函数名 def func(a,b): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a,b) return '新年好' func(2,3)
    
    

     多个装饰器装饰一个函数

     

    #多个装饰器装饰一个函数
    def wrapper1(func):
        def inner1():
            print('wrapper1 ,before func')
            ret = func()
            print('wrapper1 ,after func')
            return ret
        return inner1
    def wrapper2(func):
        def inner2():
            print('wrapper2 ,before func')
            ret = func()
            print('wrapper2 ,after func')
            return ret
        return inner2
    def wrapper3(func):
        def inner3():
            print('wrapper3 ,before func')
            ret = func()
            print('wrapper3 ,after func')
            return ret
        return inner3
    
    @wrapper3
    @wrapper2
    @wrapper1
    def f():
        print('in f')
        return '哈哈哈'
    
    print(f())
    ###
    wrapper3 ,before func
    wrapper2 ,before func
    wrapper1 ,before func
    in f
    wrapper1 ,after func
    wrapper2 ,after func
    wrapper3 ,after func
    哈哈哈
    

      wraps的用法

    from functools import wraps
    def wrapper(func):  #func = holiday
        @wraps(func)
        def inner(*args,**kwargs):
            print('在被装饰的函数执行之前做的事')
            ret = func(*args,**kwargs)
            print('在被装饰的函数执行之后做的事')
            return ret
        return inner
    
    @wrapper   #holiday = wrapper(holiday)
    def holiday(day):
        '''这是一个放假通知'''
        print('全体放假%s天'%day)
        return '好开心'
    
    print(holiday.__name__)
    print(holiday.__doc__)
    ret = holiday(3)   #inner
    print(ret)
    

      

     
     



  • 相关阅读:
    请朋友做事,须以名誉为限,为朋友做事,亦须以名誉为限
    这世上总有一些人记得你,关注着你,牵挂着你
    杏花春雨已不再,牧童遥指已不再,剑门细雨渭城轻尘也都已不再
    如果要你做鲁滨逊,你会选第三型还是第二型的朋友做“礼拜五”呢
    人类最不能伤害的就是自尊
    单靠理论和教训是无济于事的
    交真朋友已是件比较奢侈的事儿
    他一定是一个懂生活、懂人生,爱自己、爱别人的人
    国子监,就是从前的大学
    只有把理想和现实有机结合起来,才有可能成为一个成功之人
  • 原文地址:https://www.cnblogs.com/olivia2018/p/8137505.html
Copyright © 2020-2023  润新知