18 装饰器

#装饰器的作用,是不想修改函数的调用方式,但是还想在原来的函数前后添加功能
import time

def func():                  # 用户程序
    time.sleep(1.0)          # 停留1.0秒数
    print('老板好大家好')

#装饰器函数
def timmer(f):               # 一个计算一个函数执行时间的函数  (装饰器函数)
    def inner():
        start = time.time()  # 开始时间
        f()                  # 调用用户的函数并执行       (被装饰的函数)
        end = time.time()    # 结束时间
        print(end - start)   # 打印执行的时间
    return inner

func = timmer(func)          # 执行计时程序调用用户程序统计运行时间
func()
#加上语法糖@timmer后,同样的效果如下
#装饰器函数
def timmer(f):               # 一个计算一个函数执行时间的函数  (装饰器函数)
    def inner():
        start = time.time()  # 开始时间
        f()                  # 调用用户的函数并执行       (被装饰的函数)
        end = time.time()    # 结束时间
        print(end - start)   # 打印执行的时间
    return inner

@timmer                      #语法糖 @装饰器函数名
def func():                  # 被装饰的函数
    time.sleep(1.0)          # 停留1.0秒数
    print('老板好大家好')

func()
#装饰器函数  具有返回值
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(1.0)          # 停留1.0秒数
    print('老板好大家好')
    return '新年好'

ret = func()
print(ret)
#装饰器 带参数的函数  具有返回值(为完整的装饰器函数)
def timmer(f):               # 一个计算一个函数执行时间的函数  (装饰器函数)
    def inner(*args,**kwargs):
        start = time.time()  # 开始时间
        ret = f(*args,**kwargs)       # 调用用户的函数并执行       (被装饰的函数)
        end = time.time()    # 结束时间
        print(end - start)   # 打印执行的时间
        return ret
    return inner

@timmer                      #语法糖 @装饰器函数名
def func(a,b):                 # 被装饰的函数
    time.sleep(0.1)          # 停留0.1秒数
    print('老板好大家好',a,b)
    return '新年好'

ret = func(1,2)
print(ret)
ret = func(3,b = 4)
print(ret)

#完整的装饰器函数使用方法(装饰器的固定模式)

@wrapper  等同于 func = wrapper(func)

def wrapper(f):                       # 装饰器函数
    def inner(*args,**kwargs):
        '''在被装饰函数前要做的事'''
        ret = f(*args,**kwargs)       # 调用用户的函数并执行  (被装饰的函数)
        '''在调用被装饰函数之后要做的事'''
        return ret
    return inner

@wrapper                         #语法糖 @装饰器函数名
def func(*args):                 # 被装饰的函数
    print('老板好大家好',args)
    return '新年好'

ret = func([1,2,3],'df',(2,3,4))
print(ret)

 


#原则:开放封闭原则
#开放:对扩展是开放的
#封闭:对修改是封闭的

原文地址:https://www.cnblogs.com/bydzxzy/p/9650315.html