本文主要简单分析一下装饰器具体的执行流程
举例代码蓝本如下:
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print('2021-4-30')
从@log开始看,(这句相当于执行 now = log(now), 注意此时now变量指向了新的函数log(),原函数now的地址作为参数传递)
整个执行流程:
1、首先执行log函数,此时log中的wrapper没有被调用,可以先不看,返回了wrapper对象,因为wrapper后没有小括号,所以得到的是wrapper对象地址;
2、@下面执行了now(),相当于执行wrapper(); 此时执行log内函数wrapper,在被装饰函数前后执行相应功能后,返回原函数now(), 此时是有括号的,这样在wrapper函数返回时执行了原函数now(),装饰器执行完毕。
需要注意的知识点
①装饰器的作用是让你在一个函数的前后执行代码,使代码在运行期间动态的增加功能,使代码简洁、高效;
②python一切皆是对象,函数既可以传递也可以作为参数
③函数名后加()是执行,不加只是指向了一个地址,不会执行