当前位置: 首页 > article >正文

python中装饰器的作用

在Python中,装饰器(Decorator)是一种强大的工具,它允许你在不修改原有函数代码的情况下,给函数增加新的功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数,这个新函数通常是原函数的一个增强版本。装饰器遵循开放封闭原则,即对扩展开放,对修改封闭,非常有利于代码的维护和复用。

装饰器的作用主要包括但不限于以下几点:

  1. 日志记录:在不修改函数代码的前提下,为函数增加日志记录功能,方便跟踪函数执行情况或进行性能分析。

  2. 性能测试:装饰器可以计算并打印函数的执行时间,帮助开发者评估和优化代码性能。

  3. 权限校验:在Web开发中,装饰器可以用于检查用户是否有权限执行某个函数,从而简化权限管理逻辑。

  4. 函数参数验证:装饰器可以对函数的输入参数进行验证,确保参数符合预期,减少因参数错误导致的错误。

  5. 自动重试机制:在网络请求等可能失败的场景中,装饰器可以实现自动重试机制,提高程序的健壮性。

自动重试机制举例:

import time  
import random  
  
def retry(max_attempts=3, delay=1):  
    """  
    装饰器,用于实现自动重试机制。  
  
    :param max_attempts: 最大重试次数,默认为3次。  
    :param delay: 每次重试之间的延迟时间(秒),默认为1秒。  
    :return: 返回一个新的函数,该函数封装了重试逻辑。  
    """  
    def decorator(func):  
        def wrapper(*args, **kwargs):  
            attempts = 0  
            while attempts < max_attempts:  
                try:  
                    return func(*args, **kwargs)  
                except Exception as e:  
                    attempts += 1  
                    if attempts >= max_attempts:  
                        raise  # 如果达到最大重试次数,则重新抛出异常  
                    print(f"Attempt {attempts} failed with {e}. Retrying in {delay} seconds...")  
                    time.sleep(delay)  
        return wrapper  
    return decorator  
  
# 使用装饰器  
@retry(max_attempts=5, delay=2)  
def might_fail():  
    """  
    一个可能会失败的函数,这里用随机异常来模拟。  
    """  
    if random.random() > 0.8:  # 假设有20%的概率成功  
        return "Success!"  
    else:  
        raise Exception("Something went wrong!")  
  
# 测试函数  
try:  
    print(might_fail())  
except Exception as e:  
    print(f"Failed after all attempts: {e}")


http://www.kler.cn/a/312429.html

相关文章:

  • 01-Ajax入门与axios使用、URL知识
  • 灰狼优化算法
  • pip3 install -e .[stable]讲解
  • [CKS] 关闭API凭据自动挂载
  • Linux第四讲:Git gdb
  • 学Linux的第八天
  • Autosar学习----AUTOSAR_SWS_BSWGeneral(六)
  • 基于协同过滤算法+PHP的新闻推荐系统
  • 无人机维修保养一对一教学技术详解
  • LaTex2024 下载安装运行HelloWorld—全流程笔记
  • 【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
  • QT 修改全局鼠标光标样式并支持还原样式
  • 如何在多台Linux虚拟机上安装和配置Zookeeper集群
  • uboot:源码分析-启动第一阶段-start.S解析
  • brpc的简单使用
  • 力扣 11.盛最多水的容器
  • 重修设计模式-结构型-桥接模式
  • Python编码系列—Python组合模式:构建灵活的对象组合
  • Suno新上线Covers翻唱新 - 实现音频风格任意转换
  • Spring Boot-跨服务事务管理问题
  • DNS解析流程
  • 系统架构-面向对象
  • 【Python】探索 Blinker:Python 进程内信号/事件分发系统
  • uniapp vue3 梯形选项卡组件
  • springboot调用python脚本实现ocr图片文字识别功能
  • Maven踩坑——父模块生命周期的操作会被子模块继承