装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @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装饰器提供了强大的功能,可用于数据验证、格式转换、函数注册、用户验证以及异常处理等多种场景,极大地提高了代码的可读性和可维护性。通过灵活运用装饰器,开发者能够以更简洁的方式实现复杂的功能,使代码更加优雅。





























- 粉丝: 6
- 资源: 929
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 高阶AI指令大合集!.zip
- DeepSeek零基础到精通手册(保姆级教程).zip
- DeepSeek使用攻略.zip
- 【官网提示库】探索 DeepSeek 提示词样例,挖掘更多可能.zip
- 《7天精通DeepSeek实操手册》.zip
- 教大家如何使用Deepseek AI进行超级降维知识输出V1.0版.zip
- DeepSeek 15天指导手册-从入门到精通.zip
- 10天精通+DeepSeek+实操手册.zip
- 112页!DeepSeek 7大场景+50大案例+全套提示词 从入门到精通干货-202502.zip
- Deepseek+V3从零基础到精通学习手册(1).zip
- OMO2203class3面向对象.mp4
- 三相逆变器下垂控制参数调整与波形质量分析报告:直流侧电压800V,交流侧电压220V,开关频率达10kHz,模拟调频工况下性能表现优越,三相逆变器下垂控制参数调整与波形质量分析报告:直流侧电压800V
- 工具变量-上市公司企业绿色创新泡沫数据(1995-2023年).txt
- Simulink Simscape中的UR5机械臂三次多项式轨迹规划仿真:动态动画展示角度、力矩与运动参数图,六自由度UR5机械臂Simulink Simscape三次多项式轨迹规划仿真动画及数据图表
- 基于FPGA与Matlab算法的超声多普勒频移解调系统:DDS生成信号、混合与滤波处理、FFT运算及峰值搜索比对,基于FPGA和MATLAB的超声多普勒频移解调技术:DDS生成信号、混频处理、滤波、F
- 松下FP-XH双PLC 10轴摆盘程序范例:清晰分输出与调试、报警通信、启动复位,维纶通触摸屏操作,一年平稳运行经验分享,松下FP-XH双PLC 10轴摆盘程序范例:清晰思路,易学易懂,带触摸屏与通信



评论0