装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @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币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python深度强化学习方法动态规划无人机基站轨迹源码
- 峰会报告自动化生成基础教程
- 算法竞赛中的离散化 概念总结和基本操作全解
- 算法竞赛位运算(简单易懂)
- 常用一维二维 前缀和与差分算法模板总结
- SAR成像算法+后向投影(BP)算法+星载平台实测数据
- 横向循环焦点轮播图横向循环焦点轮播图横向循环焦点轮播图横向循环焦点轮播图横向循环焦点轮播图横向循环焦点轮播图横向循环焦点轮播图横向循环焦点轮播图横向循环焦点轮播图横向循环焦点轮播图横向循环焦点轮播图横
- 基于Java和HTML的留言墙、验证码、计算器基础项目设计源码
- 基于JAVA C/C++的嵌入式设备组网平台物联网框架设计源码
- 基于Java开发的高性能全文检索工具包jsearch设计源码
评论0