Python修饰符
Python修饰符也称为装饰器,它允许你用一个额外的函数来增强已有的函数而不需要修改已有函数的代码
修饰符不是一定要使用的,不使用也完全可以,只是使用了修饰符可以有如下好处:
- 代码结构更加清晰,更加优雅
- 将实现特定的功能代码封装成装饰器,提高代码复用率,增强代码可读性
修饰符有以下几个特点:
- 修饰符是一个函数:修饰符实际就是一个管理已有函数的一个函数,这个被管理的已有函数称为被修饰函数
- 修饰符取被修饰函数作为参数:修饰符需要接收被修饰函数作为参数,因此,只需要将被修饰函数作为一个函数对象传入修饰符即可
- 修饰符返回一个新函数:修饰符返回一个新函数作为其返回值,不过返回的函数需要调用被修饰的函数
- 修饰符维护被修饰函数的签名:修饰符需要确保返回的函数与被修饰的函数具有同样的参数(参数个数和类型),函数参数的个数和类型一般称为签名
修饰符以符号’@’开始,后面的函数就是装饰器,装饰器放在函数的上面,与这个函数绑定,在我们调用这个函数的时候,不是先执行这个函数,而是将函数作为参数传递给装饰器,语法如下:
@decorator
def func():
pass
1、下面例子定义一个简单的不带参数的装饰器,然后打印参数和,如图:

上图中,修饰符hello就是一个函数,被修饰函数为world,因此调用函数world的时候,实际是将world对象传递到hello函数中,作为hello函数的参数,hello函数中返回wrapper函数,wrapper最后返回函数func,这个func就是传递过来的world函数对象,因此,一个修饰符应用到一个现有函数上的时候,对这个现有函数的调用都会替换为调用修饰符返回的函数,因此,上面第14行调用world函数后,实际是由hello修饰符返回的函数wrapper来调用的
修饰符要求返回的函数wrapper和被修饰的函数func中函数签名一样,那么为什么上面使用*args和**kwargs呢?
如果一个修饰符修饰多个函数,但是每个函数的传参个数不一样,有的函数没有参数,有的有2个参数,有的有3个参数,如果使用同一个修饰符,那么最好的办法就是让修饰符的参数保持”通用”,使用*args和**kwargs即可接收任意类型和数量的参数,最后运行此代码,结果如下:

2、下面是一个带参数的装饰器,需要在原有基础上嵌套一层函数用来接收参数,如图:

- 第6行:定义外层函数用来接收修饰符参数,此函数中调用return来返回hello函数
- 第7行:hello函数中的参数就是传递过来的world函数对象,在hello中调用return返回wrapper
- 第8行:wrapper中对参数params进行判断然后执行相关内容,然后调用func,实际执行的world函数

从上图看出,不用修改现在world()函数代码,即可实现在函数前后增加内容或者其余的一些操作,增强了函数的功能
3、上面的是基于函数的装饰器,除此之外还有基于类的装饰器,实现类装饰器,类必须实现__call__和__init__两个内置函数,__init__用于接收被修饰函数,__call__用于实现装饰逻辑
下面是一个不带参数的类装饰器,如图:


4、带参数的类装饰器
带参数和不带参数的类装饰器有很大的不同,__init__不再接收被装饰函数,而是接收传入参数,__call__接收被装饰函数,实现装饰逻辑
下面是一个带参数的类装饰器的例子,如图:




