1. 装饰器的原型
1 | import time |
对foo
函数进行增强;
2. 不带参数的装饰器:(装饰器,被装饰函数都不带参数)
1 | import time |
3. 带参数的被装饰的函数
1 | import time |
4. 带参数的装饰器(装饰函数)
实际是对原有装饰器的一个函数的封装,并返回一个装饰器(一个含有参数的闭包函数),
当使用@time_logger(3)调用的时候,Python能发现这一层封装,并将参数传递到装饰器的环境去
1 | import time |
多加一层闭包,把参数传进去
5. 类装饰器:一般依靠类内部的call方法
1 | import time |
6. 使用装饰器的缺点
1.位置错误的代码 不能在装饰器之外添加逻辑功能
2.不能装饰@staticmethod 或者 @classmethod已经装饰过的方法
3.装饰器会对原函数的元信息进行更改,比如函数的docstring,name,参数列表
1 | import time |
由此可以看出,装饰器会对原函数的元信息进行更改,可以使用wraps,进行原函数信息的添加
注解:wraps本身也是一个装饰器,他能把函数的元信息拷贝到装饰器函数中使得装饰器函数与原函数有一样的元信息
以下是一个wraps的例子:
1 | #6.4. 使用wraps把被装饰的函数信息绑定进装饰器 |
1 | import time |
常用的内置装饰器
staticmethod: 类似实现了静态方法 注入以后,可以直接 : 类名.方法
property: 经过property装饰过的函数 不再是一个函数,而是一个property, 类似实现get,set方法
1 | @property |
- classmethod: 与staticmethod很相似,貌似就只有这一点区别:
第一个参数需要是表示自身类的 cls 参数, 可以来调用类的属性,类的方法,实例化对象等。