装饰器详解(python)

来源:互联网 发布:好的莆田鞋淘宝店 编辑:程序博客网 时间:2024/06/01 19:16

本文将介绍装饰器的内容,并举例说明。

装饰器在python中实际上就是一个函数,这个函数可以在不改变原(其他)函数代码和调用方式的条件下为原函数添加功能。装饰器(函数)在结尾返回一个函数对象。常常用于插入日志、性能测试、事务处理、缓存、权限校验等场景。

编写装饰器函数的原则是:

1. 不能修改原函数(被装饰的函数)的源代码。

2. 不能修改原函数的调用方式。

下面我们从原函数开始,以逐渐满足两个原则的步骤得到装饰器代码。

首先定义原函数

__author__ = "Allen Liu"__time__ = "2017/8/1"'''This program is an example of decorator '''import timedef func1():    print('Start the function fun1...')    time.sleep(1)    print('The function fun1 is end!')
那么我们想为函数添加一个计时的功能,想要达到的效果就是可以得到函数执行花费的时间,例如输出‘The time of fun1 cost is **’。

在不改变原函数代码的条件下,我们可以定义一个名为deco的函数统计原函数所需的运行时间:

def deco(fun):     start_time = time.time()     fun()     end_time = time.time()     run_time = end_time - start_time     print('The running time is %f' % run_time)
然后调用deco函数获得运行时间:

deco(func1)
这种方法满足装饰器的第一个原则:不改变源代码。但是改变了原函数的调用方式,(原函数的调用方式为func1())。

下面我们通过函数嵌套的方式,对上面的deco函数做出修改,使其满足第二条原则:

def deco(fun):    def wrapper():        start_time = time.time()        fun()        end_time = time.time()        run_time = end_time - start_time        print('The running time is %f' % run_time)    return wrapperfunc1 = deco(func1)func1()
这时候将函数func1传入deco函数,函数的输出为一个函数wrapper,将其复制给变量func1,在通过加小括号的方式运行该函数。就达到了不改变函数调用方式的原则。可见这样就满足了装饰器的两个原则,一个比较完整的装饰器(deco)就得到了。

下面介绍装饰器语法糖:

在Python中,可以使用”@”语法糖来精简装饰器的代码,此时只需要在func1函数定义前添加代码@deco

这句代码等价于:func1 = deco(func1)。然后就可以直接通过func1()进行调用。






原创粉丝点击