一、装饰器是什么?
装饰器,顾名思义,就是增强函数或类的功能的一个函数。
作用:在不修改功能代码的同时,给代码扩展新的功能,可以装饰函数,也可以装饰类。
举个例子:如何计算函数的执行时间?
如下,计算 add 函数的执行时间。
又假如,新的需求让你计算减法函数(sub)的时间。不用装饰器的话,我们又得重复写一段减法的代码。
两段代码,其中实现计算函数执行时间的逻辑是完全一样的,按照如上写法,维护困难且难以拓展,要改动的话所有地方都要改动,要拓展到其他函数的话,其他函数也要加上这段逻辑,我们可以将之提取出来,单独实现一个计算函数执行时间的函数,在需要的时候以合适的方式调用,这一类可以对所有函数拓展新功能的函数,就可以称之为装饰器。
使用装饰器之后的代码是这样的
使用装饰器实现共同需要的功能,可以大大简化我们的代码。
定义装饰器
二、使用装饰器
假设decorator是定义好的装饰器。
使用装饰器有两种方法
方法一:不用语法糖@符号
方法二:采用语法糖@符号
三、装饰器参数
装饰器可以传参,也可以不用传参。
1、自身不传入参数的装饰器(采用两层函数定义装饰器)
自身传入参数的装饰器(采用三层函数定义装饰器)
四、多个装饰器顺序
1、装饰的顺序(不调用函数)
可以看出,装饰的顺序为由下往上
2、装饰器执行的顺序(调用函数)
装饰器执行的顺序与装饰的顺序相反,先执行后装饰的装饰器函数,在调用原函数时再进入并执行先装饰的装饰器函数,然后退出当前装饰器函数,再退出外层的装饰器函数
3、常见应用场景
在实际应用的场景中,当我们采用上面的方式写了两个装饰方法比如先验证有没有登录 @login_required , 再验证权限够不够时 @permision_allowed 时,我们采用下面的顺序来装饰函数:
总结:多个装饰器装饰函数时,从下到上包裹(装饰)函数,从上到下执行。