装饰器详解(python)

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

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

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

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

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

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

首先定义原函数

__author__ = "Allen Liu"
__time__ = "2017/8/1"
'''This program is an example of decorator '''
import time
def 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 wrapper
func1 = deco(func1)
func1()
这时候将函数func1传入deco函数,函数的输出为一个函数wrapper,将其复制给变量func1,在通过加小括号的方式运行该函数。就达到了不改变函数调用方式的原则。可见这样就满足了装饰器的两个原则,一个比较完整的装饰器(deco)就得到了。

下面介绍装饰器语法糖:

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

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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值