装饰器

装饰器原理

import time
#
# time.sleep(2) #让程序执行到这个位置时停一会
# print('2 sec')
#
# print(time.time()) #从1970年至现在的秒数
#
# def func():
#     start = time.time() #获取当前时间
#     print("hello")
#     time.sleep(0.01)
#     end = time.time() #获取完成后的时间
#     print(end - start)
#
# func()
#
# def timmer(f):
#     start = time.time()
#     f()
#     end = time.time()
#     print(end - start)
#
# timmer(func)

#不修改函数的调用方式,在原函数的前后添加功能
def func(): #原函数功能
    time.sleep(0.01)
    print("函数体")

def timmer(f): #在原函数功能基础上,增加了功能,是装饰器函数
    def inner():
        start = time.time()
        f() #被装饰得函数
        end = time.time()
        print(end - start)
    return inner

func = timmer(func) #用相同的名字调用原函数
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()
print(ret)

 

带参数和返回值的装饰器

#装饰带参数函数的装饰器

import time
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): #被装饰的函数
    time.sleep(0.01)
    print("函数体", a)
    return("返回值")


# func = timmer(func) #用相同的名字调用原函数
ret = func('传参')
print(ret)

 

装饰器的固定模式

#装饰器的固定模式

def wrapper(f):
    def inner(*args, **kwargs):
        #被装饰函数之前执行的代码
        ret = f(*args, **kwargs)
        #被装饰函数之后执行的代码
        return ret
    return inner


@wrapper
def func(a, b):
    print("原函数功能", a, b)
    return '返回值'

 

posted @ 2020-03-29 21:14  vivagoal  阅读(93)  评论(0)    收藏  举报