首页 > 技术文章 > 装饰器

zh-lei 2018-04-18 15:25 原文

1、什么是装饰器?

#在不改变原函数的调用的情况下,为原函数增加一些额外的功能,打印日志,执行时间,登录认证

2、装饰器的形成过程

# 需求写一个函数测试另一个函数的执行效率
最初的实现方式,但是改变了函数的调用方式,需要改进
def timer(f1):
    start_time = time.time()
    f1()
    end_time = time.time()
    print(end_time- start_time)

timer(func1)
改进后调用方式基本相似,但是多加了两行代码

def timer(f1):
    start_time = time.time()
    f1()
    end_time = time.time()
    print(end_time- start_time)

f = func1
func1 = timer
func1(f)  #== timer(func1)
最优的方法
def timer(f1):
    def inner():
        start_time = time.time()
        f1()
        end_time = time.time()
        print(end_time - start_time)
    return inner
func1 = timer(func1) #做下关系转换
func1()
通过python提供的语法塘实现装饰器
def timer(f1):
    def inner():
        start_time = time.time()
        f1()
        end_time = time.time()
        print(end_time - start_time)
    return inner

@timer   == func1 = timer(func1)
def func1():
    print("晚上回去吃烧烤")
    time.sleep(0.3)
@timer  == func2 = timer(func2)
def func2():  
    print("晚上回去和啤酒")
    time.sleep(0.3)
func1()
func2()

 

# 装饰器传参
def timer(f1):
    def inner(*args, **kwargs):
        start_time = time.time()
        f1(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
    return inner

@timer   #== func1 = timer(func1)
def func1(a, b):
    print("晚上回去吃烧烤")
    time.sleep(0.3)
@timer  #== func2 = timer(func2)
def func2(a, b):
    print("晚上回去和啤酒")
    time.sleep(0.3)

func1(111,222)  #参数首先传到inner()函数 *args,然后在传到f1()函数中
func2(222,333)

 

# 函数返回值
def timer(f1):
    def inner(*args, **kwargs):
        start_time = time.time()
        ret = f1(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
        return ret
    return inner

@timer   #== func1 = timer(func1)
def func1(a, b):
    print("晚上回去吃烧烤")
    time.sleep(0.3)
    return 666
ret = func1(1, 2)
print(ret)
装饰器的写法规范
def wrapper(f1):
    def inner(*args, **kwargs):
        执行函数之前的操作
        ret = f1() #返回值
        执行函数之后的操作
        return ret
    return inner

 




推荐阅读