zoukankan      html  css  js  c++  java
  • 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)
    

      

     
     



  • 相关阅读:
    Mysql Got a packet bigger than 'max_allowed_packet' bytes
    Git之IDEA集成Git更新项目Update Type选项解释
    IDEA获取GIT仓库时更新类型update type的选择
    git merge和git rebase的区别
    git merge和git merge --no-ff的区别
    Git中fetch和pull命令的区别
    git官网下载太慢解决方法
    IDEA执行Thread.activeCount() = 2的问题
    k8s 常见错误汇总
    Axure9破解
  • 原文地址:https://www.cnblogs.com/olivia2018/p/8137505.html
Copyright © 2011-2022 走看看