装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): return 3 @regis Python装饰器是Python语言中的一个重要特性,它允许我们修改或增强已有函数的功能,而不改变其原始代码。在本文中,我们将深入探讨装饰器在不同场景下的应用,并通过代码示例来展示它们的具体实现。 装饰器常用于数据的清理或添加功能。例如,我们可以编写一个装饰器`@require_ints`来验证函数的参数类型,确保所有参数都是整数。这在处理输入数据时非常有用,可以防止因类型错误引发的异常。 ```python from functools import wraps def require_ints(func): @wraps(func) def inner(*args, **kwargs): for arg in list(args) + list(kwargs.values()): if not isinstance(arg, int): raise TypeError(f"{func.__name__} 只接受int类型参数") return func(*args, **kwargs) return inner ``` 装饰器可以用于数据格式转换,比如将函数的返回值从字典转换为JSON或YAML格式。下面的`@json_output`装饰器就是这样一个例子,它将函数的输出转换为JSON字符串: ```python import json from functools import wraps def json_output(func): @wraps(func) def inner(*args, **kwargs): return json.dumps(func(*args, **kwargs)) return inner ``` 此外,装饰器可以用于函数的注册,这在构建系统或任务调度中非常常见。例如,我们可以创建一个简单的函数注册表,将函数添加到列表中以便后续执行: ```python 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] ``` 为了更好地管理和隔离注册表,我们可以使用类来实现,每个实例对应一个独立的注册表: ```python 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 def c(): return 7 # 执行r1和r2中的函数 print(r1.run_all()) print(r2.run_all()) ``` 装饰器还能用于用户验证,如`@requires_user`装饰器,它可以检查传入的用户对象是否有效: ```python from functools import wraps class User(object): def __init__(self, username, email): self.username = username self.email = email class AnonymousUser(object): def __init__(self): self.username = self.email = None def requires_user(func): @wraps(func) def inner(user, *args, **kwargs): if user and isinstance(user, User): return func(user, *args, **kwargs) else: raise ValueError("非合法用户") return inner ``` 装饰器可以用于异常处理,如`@json_output`装饰器捕获特定异常并以JSON格式返回错误信息: ```python import json from functools import wraps class Error1(Exception): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg def json_output(func): @wraps(func) def inner(*args, **kwargs): try: result = func(*args, **kwargs) except Error1 as ex: result = {"status": "error", "msg": str(ex)} return json.dumps(result) return inner @json_output def error(): raise Error1("该条异常会被捕获并按JSON格式输出") ``` Python装饰器提供了强大的功能,可用于数据验证、格式转换、函数注册、用户验证以及异常处理等多种场景,极大地提高了代码的可读性和可维护性。通过灵活运用装饰器,开发者能够以更简洁的方式实现复杂的功能,使代码更加优雅。
- 粉丝: 5
- 资源: 929
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0