前言
之前写过一篇博文:《Python的闭包与装饰器》,但是这篇博文重点讲的是闭包,对装饰器的讲解很少,最近对装饰有了一些新的认识,所以再次发文补充!
Python中的装饰器可以分为:函数装饰器和类装饰器
函数装饰器
首先提一下函数有关的几个前提知识:
函数也是对象,函数可以被赋值给一个变量。
函数可以作为参数,传给另一个函数。
在Python中,我们可以在函数中定义函数。
函数的返回值也可以是函数对象(闭包)。
有了上面的知识就不难理解装饰器了,下面进入正题!
函数装饰器的实质就是:装饰器是一个函数,它至少有一个函数作为参数,它返回值是一个函数对象!
不带参数的装饰器
直接看例子代码:
1 | def my_decorator(func): |
带有参数的装饰器
如果被装饰的函数有参数,那么装饰器中可以直接加上对应的参数
1 | def my_decorator(func): |
如果另一个函数也想用这个装饰器,但是另一个函数的参数不一样了该怎么办?加上*args和**kwargs
1 | def my_decorator(func): |
带有自定义参数的装饰器
上面提到的参数都是被装饰函数所需要的参数,但是装饰器其实可以更灵活,它还可以接受自己定义的参数。
看例子:统计函数执行次数的装饰器
1 | def repeat(num): |
类装饰器
类也可以作为装饰器,类装饰器主要依赖于函数__call__(),每当你调用一个类的示例时,函数__call__()就会被执行一次!
看例子:
1 | class Count: |
总结
所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改。
装饰器应用广泛,最常见的就是身份认证、日志统计、输入合理性检查及缓存等。