如何理解Python装饰器?
一、什么是Python装饰器?
从字面意思就可以理解,它是用来"装饰"Python的工具,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就是一个函数,然后通过实现各种功能来对这个函数的功能进行增强。
二、为什么用装饰器?
装饰器是通过某种函数来增强函数的功能。当然,我们可以通过很多种方式来增强函数的功能,只是装饰器有一个无法替代的优势——简洁
三、在什么时候会用到装饰器?
装饰器最大的优势是用于解决重复性的操作,其主要使用的场景有如下几个:
- 插入日志
- 计算函数运行时间
- 类型检查
- 事务处理
- …
四、案例
如果你要对多个函数进行统计运行时间,不使用装饰器会是这样的
from time import time, sleep
def fun_one():
start = time()
sleep(1)
end = time()
cost_time = end - start
print("func one run time {}".format(cost_time))
def fun_two():
start = time()
sleep(1)
end = time()
cost_time = end - start
print("func two run time {}".format(cost_time))
def fun_three():
start = time()
sleep(1)
end = time()
cost_time = end - start
print("func three run time {}".format(cost_time))
在每个函数里都需要获取开始时间start、结束时间end、计算耗费时间cost_time、加上一个q-9-a输出语句。
使用装饰器的方法后是这个样子的:
from time import time, sleep
def run_time(func):
def wrapper():
start = time()
func()
end = time()
cost_time = end - start
print("func three run time {}".format(cost_time))
return wrapper
@run_time
def fun_one():
sleep(1)
@run_time
def fun_two():
sleep(1)
@run_time
def fun_three():
sleep(1)
通过编写一个统计时间的装饰器run_time,函数的作为装饰器的参数,然后返回一个统计时间的函数wrapper,这就是装饰器的写法,用专业属于来说这叫闭包,简单来说就是函数内嵌套函数。然后再每个函数上面加上@run_time来调用这个装饰器对不同的函数进行统计时间。
可见,统计时间这4行代码是重复的,一个函数需要4行,如果100个函数就需要400行,而使用装饰器,只需要几行代码实现一个装饰器,然后每个函数前面加一句命令即可,如果是100个函数,能少300行左右的代码量,可见,Python装饰器的用途还是非常广泛的。