【python装饰器:参数,顺序,场景】

时间:2023-02-05 16:58:12

一、装饰器是什么?

装饰器,顾名思义,就是增强函数或类的功能的一个函数。

作用:在不修改功能代码的同时,给代码扩展新的功能,可以装饰函数,也可以装饰类。
举个例子:如何计算函数的执行时间?
如下,计算 add 函数的执行时间。​​​​​​​

【python装饰器:参数,顺序,场景】

又假如,新的需求让你计算减法函数(sub)的时间。不用装饰器的话,我们又得重复写一段减法的代码。

【python装饰器:参数,顺序,场景】

两段代码,其中实现计算函数执行时间的逻辑是完全一样的,按照如上写法,维护困难且难以拓展,要改动的话所有地方都要改动,要拓展到其他函数的话,其他函数也要加上这段逻辑,我们可以将之提取出来,单独实现一个计算函数执行时间的函数,在需要的时候以合适的方式调用,这一类可以对所有函数拓展新功能的函数,就可以称之为装饰器。

使用装饰器之后的代码是这样的

【python装饰器:参数,顺序,场景】

使用装饰器实现共同需要的功能,可以大大简化我们的代码。

定义装饰器

【python装饰器:参数,顺序,场景】

二、使用装饰器

假设decorator是定义好的装饰器。
使用装饰器有两种方法

方法一:不用语法糖@符号​​​​​​​

【python装饰器:参数,顺序,场景】

方法二:采用语法糖@符号​​​​​​​

【python装饰器:参数,顺序,场景】

三、装饰器参数

装饰器可以传参,也可以不用传参。
1、自身不传入参数的装饰器(采用两层函数定义装饰器)

【python装饰器:参数,顺序,场景】

自身传入参数的装饰器(采用三层函数定义装饰器)

【python装饰器:参数,顺序,场景】

四、多个装饰器顺序

1、装饰的顺序(不调用函数)

【python装饰器:参数,顺序,场景】

可以看出,装饰的顺序为由下往上

2、装饰器执行的顺序(调用函数)

【python装饰器:参数,顺序,场景】

装饰器执行的顺序与装饰的顺序相反,先执行后装饰的装饰器函数,在调用原函数时再进入并执行先装饰的装饰器函数,然后退出当前装饰器函数,再退出外层的装饰器函数

3、常见应用场景

在实际应用的场景中,当我们采用上面的方式写了两个装饰方法比如先验证有没有登录 @login_required , 再验证权限够不够时 @permision_allowed 时,我们采用下面的顺序来装饰函数:

【python装饰器:参数,顺序,场景】

总结:多个装饰器装饰函数时,从下到上包裹(装饰)函数,从上到下执行。