zoukankan      html  css  js  c++  java
  • 函数装饰器

    装饰器

    一、装饰器的形成过程

    最简单的装饰器------->有返回值--------->有一个参数---------->万能参数

    最简单的装饰器

    import time
    def func():
        time.sleep(1)
        print("大家好")
    def timmer(f):        #装饰器函数
        def inner():
            start=time.time()
            f()              #被装饰的函数
            end=time.time()
            print(end-start)
        return inner
    func=timmer(func)     #相当于inner()
    func

    有返回值

    import time
    def timmer(f):    #装饰器函数
        def inner():
            start = time.time()
            ret = f()       #被装饰的函数
            end = time.time()
            print(end - start)
            return ret
        return inner
    
    @timmer         #语法糖 @装饰器函数名
    def func():     #被装饰的函数
        time.sleep(0.01)
        print('老板好同事好大家好')
        return '新年好'
    # func = timmer(func)
    ret = func()   #inner()
    print(ret)

    装饰带参数函数的装饰器

    import time
    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 func1(a):     #被装饰的函数
        time.sleep(0.01)
        print('老板好同事好大家好',a)
        return '新年好'
    # func = timmer(func)
    ret = func(1,2)   #inner()
    ret = func(1,b = 2)   #inner()
    print(ret)

    二、装饰器的作用

    1、不想修改函数的调用方式,但是还想在原来的函数前后添加功能。

    2、timmer就是一个装饰器函数,但是对一个函数有一些装饰作用。

    三、原则:开放封闭原则

    开放:对扩展是开放的

    封闭:对修改是封闭的

    四、装饰器的固定模式

    def wrapper(func):   #qqxing
        def inner(*args,**kwargs):
            ret = func(*args,**kwargs)   #被装饰的函数
            return ret
        return inner
    
    @wrapper        #qqxing = wrapper(qqxing)
    def qqxing():
        print(123)
    
    ret = qqxing()   #inner
    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 '新年好'
    
    def wrapper():
        def inner():
            pass
        return inner
    固定模式

     五、wraps

    from functools import wraps      #导入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__)     #document
    ret = holiday(3)   #inner
    print(ret)

    六、带参数的装饰器

    import time
    FLAGE = 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 = timmer_out(FLAGE)
    @timmer_out(FLAGE)    #wahaha = timmer(wahaha)
    def wahaha():
        time.sleep(0.1)
        print('wahahahahahaha')
    
    @timmer_out(FLAGE)
    def erguotou():
        time.sleep(0.1)
        print('erguotoutoutou')
    
    wahaha()
    erguotou()

    七、多个装饰器装饰一个函数

    注意:哪个装饰器离函数近,先执行哪个装饰器

  • 相关阅读:
    单元测试
    软件测试计划
    软件杯A9的设计与实现
    阅读笔记7
    阅读笔记6
    阅读笔记5
    阅读笔记4
    阅读笔记3
    阅读笔记2
    阅读笔记1
  • 原文地址:https://www.cnblogs.com/gaoya666/p/8137336.html
Copyright © 2011-2022 走看看