一、理解装饰器
通俗点说,当我们想给一个函数增强额外的功能,但又不想修改原函数的定义,同时新增的功能其它函数可能也需要使用,装饰器就是来解决这种需求的,将与原函数功能无关的代码提取出来,实现复用,在代码运行期间动态的给原函数增加功能,例如在函数执行前后插入日志、计算函数的执行时间等等
二、实践
1、一个小需求
有一个需求,要在函数执行前后打印start execute、end execute,如果我们还不知道有装饰器存在可以怎么做呢?
首先定义原函数:
def my_func():
print('Hello World')
再定义一个函数用来打印日志,并在其中执行原函数:
def log(func):
def wrapper():
print('start execute')
func()
print('end execute')
return wrapper
可以看到,log函数接收一个函数作为参数,并返回一个新的wrapper函数。
最后看执行结果:
my_func = log(my_func)
my_func()
0
我们将my_func函数作为参数传给log函数,并将返回的wrapper函数赋值给my_func变量,则my_func变量就是返回的wrapper函数,并不是之前定义的my_func函数,最