背景

我刚开始接触python的时候就想着怎么实现java中注解(@语法)的方式写代码,毕竟这样在调用的时候真的很方便,于是我就在网上找了下发现在python中早就有这种方式了,这就是今天给大家分享的python装饰器@

从打印日志说起

日志功能很简单,就是记录下调用函数的名称,以及函数执行的时间,不使用装饰器的做法如下:

from time import time
# 定义log函数
def log(func):
    start_time = time()
    func()
    end_time = time()
    run_time = end_time - start_time
    print('执行函数{}使用时长:{}'.format(func.__name__,run_time))

# 定义普通调用函数
def say():
    print('hello,www.h3blog.com')

# 输出调用say的执行时间
log(say)

输出结果:

hello,www.h3blog.com
执行函数say使用时长:3.337860107421875e-05

其实上面的方式是通过python闭包调用的

使用装饰器调用

from time import time
import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args,**kwargs):
        start_time = time()
        ret = func(*args,**kwargs)
        end_time = time()
        run_time = end_time - start_time
        print('执行函数{}使用时长{}'.format(func.__name__,run_time))
        return ret
    return wrapper

@log
def say():
    print('hello,www.h3blog.com')


if __name__ == '__main__':
    say()

终归起来python中的装饰器就是闭包回调函数的一次封装,而@语法糖也是为方便调用而设计的