装饰器: 一个返回函数的函数,用于给其他函数统一添加功能,比如日志,性能测试,缓存,校验等
初级装饰器: def debug(func): def wrapper (*args, **kwargs): #传递一切参数 anything #添加功能 return func(*args, **kwargs) return wrapper使用时在函数定义前加一行 @debug 2. 带参数的装饰器:在外层加一层函数,负责传递参数,参数最后会被保存在生成函数的__closure__属性中(俗称内包) 3. 用类实现装饰器:内置了__call__()方法的类可以被用作装饰器。
class debug (object): def __ init__ (self, func): self.func=func def __ call__(self, *args, **kwargs): anything return self.func(*args, **kwargs)使用时在函数定义前加一行 @debug 如果要带外部参数,就在init中传入参数,在call中传入函数,里面再def一个wrapper (*args, **kwargs) 4. 内置装饰器 @property,使用后可以将对属性的赋值、查看、删除重载为自定义函数 详见https://www.liaoxuefeng.com/wiki/1016959663602400/1017502538658208 @staticmethod,@classmethod,类中的实例方法第一个参数是self,指代实例,类方法@classmethod第一个参数是cls,指的是类,静态方法@staticmethod,只是恰巧处于类中的普通函数 详见https://zhuanlan.zhihu.com/p/28010894 5. 细节:不能装饰静态方法和类方法,请把装饰器放在下面 6. 优化装饰器:使用decorator.py,定义包装函数wrapper(func, *args, **kwargs),然后decorator (func, wrapper)即为返回的函数。或者使用@decorator,直接定义装饰器logging(func, *args, **kwargs),不过查找func的时候要inspect.getsource(func.__ wrapped__) 7. Wrapt包:比decorator.py改善了inspect的问题,使用方法:@wrapt.decorator,def logging(wrapped, instance, args, kwargs)
来源
