装饰器

# 装饰器形成的过程 : 最简单的装饰器 有返回值的 有一个参数 万能参数
# 装饰器的作用
# 原则 :开放封闭原则
# 语法糖 :@
# 装饰器的固定模式

import time
# # print(time.time()) # 获取当前时间
# # time.sleep(10)  #让程序在执行到这个位置的时候停一会儿

# def timmer(f):    #装饰器函数
#     def inner():
#         start = time.time()
#         ret = f()       #被装饰的函数
#         end = time.time()
#         print(end - start)
#         return ret
#     return inner
#
# @timmer         #语法糖 @装饰器函数名  #与func = timmer(func)功能相同
# def func():     #被装饰的函数
#     time.sleep(0.01)
#     print('老板好同事好大家好')
#     return '新年好'
# # func = timmer(func)
# ret = func()   #inner()
# print(ret)
# 装饰器的作用 —— 不想修改函数的调用方式 但是还想在原来的函数前后添加功能
# timmer 就是一个装饰器函数,只是对一个函数 有一些装饰作用

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

装饰器形成过程
#装饰带参数函数的装饰器
# 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 '新年好'
# 有一个参数的情况
# @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)

装饰器固定格式

# def wrapper(f):    #装饰器函数,f是被装饰的函数
#     def inner(*args,**kwargs):
#         '''在被装饰函数之前要做的事'''
#         ret = f(*args,**kwargs)    #被装饰的函数
#         '''在被装饰函数之后要做的事'''
#         return ret
#     return 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(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()

 完美的装饰器

# from functools import wraps
# def wrapper(f):    #装饰器函数,f是被装饰的函数
#     @wraps(f)
#     def inner(*args,**kwargs):
#         '''在被装饰函数之前要做的事'''
#         ret = f(*args,**kwargs)    #被装饰的函数
#         '''在被装饰函数之后要做的事'''
#         return ret
#     return inner