装饰器的应用场景
附加功能
数据的清理或添加:
函数参数类型验证 @require_ints 类似请求前拦截
数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改
为函数提供额外的数据 mock.patch
函数注册
在任务中心注册一个任务
注册一个带信号处理器的函数
不同应用场景下装饰器实现
函数注册表
简单注册表
funcs = []
def register(func):
funcs.append(func)
return func
@register
def a():
return 3
@register
def b():
return 5
# 访问结果
result = [func() for func in funcs]
注册表隔离(使用类的不同实例)
class Registry(object):
def __init__(self):
self._funcs = []
def register(self, func):
self._funcs.append(func)
def run_all(self):
return [func() for func in self._funcs]
r1 = Registry()
r2 = Registry()
@r1.register
def a():
return 3
@r2.register
def b():
return 5
@r1.register
@r2.register
执行时封装代码
类型检查
from functools import wraps
def require_ints(func):
@wraps(func) # 将func的信息复制给inner
def inner(*args, **kwargs):
for arg list(args) + list(kwargs.values()):
if not isinstance(arg, int:
龙腾原创
联系作者:xiaowanzi02620