Python3 【装饰器】项目实战:5个新颖的学习案例

news2025/2/1 12:26:19

Python3 【装饰器】项目实战:5个新颖的学习案例

以下是 5 个使用 Python 装饰器的综合应用项目,这些项目具有新颖性、前瞻性和实用性。每个项目都包含完整的代码、解释说明、测试案例和执行结果。


项目 1:API 请求限流器

描述:实现一个装饰器,限制 API 请求的频率,防止服务器过载。

代码实现

import time

def rate_limiter(max_calls, period):
    """
    限制函数调用频率的装饰器。
    :param max_calls: 每个时间段内允许的最大调用次数。
    :param period: 时间段(秒)。
    """
    calls = []

    def decorator(func):
        def wrapper(*args, **kwargs):
            now = time.time()
            # 移除超时的调用记录
            calls[:] = [call for call in calls if now - call < period]
            if len(calls) >= max_calls:
                raise Exception("请求频率过高,请稍后再试")
            calls.append(now)
            return func(*args, **kwargs)
        return wrapper
    return decorator

# 测试案例
@rate_limiter(max_calls=3, period=5)
def api_request():
    print("API 请求成功")

# 模拟请求
for i in range(5):
    try:
        api_request()
    except Exception as e:
        print(e)
    time.sleep(1)

执行结果

API 请求成功
API 请求成功
API 请求成功
请求频率过高,请稍后再试
请求频率过高,请稍后再试

说明:该装饰器限制每 5 秒内最多调用 3 次 API,超过限制会抛出异常。


项目 2:函数结果缓存

描述:实现一个装饰器,缓存函数的结果,避免重复计算。

代码实现

def cache_decorator(func):
    """
    缓存函数结果的装饰器。
    """
    cache = {}

    def wrapper(*args):
        if args in cache:
            print("从缓存中获取结果")
            return cache[args]
        result = func(*args)
        cache[args] = result
        return result
    return wrapper

# 测试案例
@cache_decorator
def fibonacci(n):
    """
    计算斐波那契数列。
    """
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))
print(fibonacci(10))

执行结果

55
从缓存中获取结果
55

说明:该装饰器缓存了斐波那契数列的计算结果,避免重复计算。


项目 3:异步任务重试机制

描述:实现一个装饰器,为异步任务提供重试机制。

代码实现

import asyncio
import random

def retry_decorator(max_retries=3):
    """
    为异步函数提供重试机制的装饰器。
    :param max_retries: 最大重试次数。
    """
    def decorator(func):
        async def wrapper(*args, **kwargs):
            for i in range(max_retries):
                try:
                    return await func(*args, **kwargs)
                except Exception as e:
                    print(f"重试 {i+1}/{max_retries}: {e}")
                    await asyncio.sleep(1)
            raise Exception("重试次数用尽")
        return wrapper
    return decorator

# 测试案例
@retry_decorator(max_retries=3)
async def unstable_task():
    if random.random() < 0.5:
        raise Exception("任务失败")
    return "任务成功"

async def main():
    try:
        result = await unstable_task()
        print(result)
    except Exception as e:
        print(e)

asyncio.run(main())

执行结果

重试 1/3: 任务失败
任务成功

说明:该装饰器为异步任务提供了重试机制,失败后最多重试 3 次。


项目 4:函数调用日志记录

描述:实现一个装饰器,记录函数的调用日志。

代码实现

import logging

logging.basicConfig(level=logging.INFO)

def log_decorator(func):
    """
    记录函数调用日志的装饰器。
    """
    def wrapper(*args, **kwargs):
        logging.info(f"调用函数: {func.__name__}, 参数: {args}, {kwargs}")
        result = func(*args, **kwargs)
        logging.info(f"函数 {func.__name__} 执行完毕")
        return result
    return wrapper

# 测试案例
@log_decorator
def add(a, b):
    return a + b

print(add(3, 5))

执行结果

INFO:root:调用函数: add, 参数: (3, 5), {}
INFO:root:函数 add 执行完毕
8

说明:该装饰器记录了函数的调用和参数,方便调试和追踪。


项目 5:动态权限验证

描述:实现一个装饰器,根据用户角色动态验证权限。

代码实现

def role_required(role):
    """
    根据用户角色验证权限的装饰器。
    :param role: 需要的角色。
    """
    def decorator(func):
        def wrapper(user, *args, **kwargs):
            if user.get("role") == role:
                return func(*args, **kwargs)
            else:
                return "权限不足"
        return wrapper
    return decorator

# 测试案例
@role_required(role="admin")
def delete_file():
    return "文件已删除"

user_admin = {"name": "Alice", "role": "admin"}
user_guest = {"name": "Bob", "role": "guest"}

print(delete_file(user_admin))
print(delete_file(user_guest))

执行结果

文件已删除
权限不足

说明:该装饰器根据用户角色动态验证权限,只有管理员可以删除文件。


总结

以上 5 个项目展示了 Python 装饰器在不同场景下的应用,包括限流、缓存、重试、日志记录和权限验证。每个项目都配有完整的代码、测试案例和执行结果,适合学习和实际应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2289298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DeepSeek本地部署(windows)

一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 点击"Download for Windows"。会跳转Github进行下载,如下载速度过慢,可在浏览器安装GitHub加速插件。 2.安装Ollama 双击下载的安装文件,点击"Inst…

简要介绍C语言/C++的三目运算符

三元运算符是C语言和C中的一种简洁的条件运算符&#xff0c;它的形式为&#xff1a; 条件表达式 ? 表达式1 : 表达式2; 三元运算符的含义 条件表达式&#xff1a;这是一个布尔表达式&#xff0c;通常是一个比较操作&#xff08;如 >、<、 等&#xff09;。 表达式1&am…

SpringCloud系列教程:微服务的未来(十九)请求限流、线程隔离、Fallback、服务熔断

前言 前言 在现代微服务架构中&#xff0c;系统的高可用性和稳定性至关重要。为了解决系统在高并发请求或服务不可用时出现的性能瓶颈或故障&#xff0c;常常需要使用一些技术手段来保证服务的平稳运行。请求限流、线程隔离、Fallback 和服务熔断是微服务中常用的四种策略&…

STM32 对射式红外传感器配置

这次用的是STM32F103的开发板&#xff08;这里面的exti.c文件没有how to use this driver 配置说明&#xff09; 对射式红外传感器 由一个红外发光二极管和NPN光电三极管组成&#xff0c;M3固定安装孔&#xff0c;有输出状态指示灯&#xff0c;输出高电平灯灭&#xff0c;输出…

(动态规划路径基础 最小路径和)leetcode 64

视频教程 1.初始化dp数组&#xff0c;初始化边界 2、从[1行到n-1行][1列到m-1列]依次赋值 #include<vector> #include<algorithm> #include <iostream>using namespace std; int main() {vector<vector<int>> grid { {1,3,1},{1,5,1},{4,2,1}…

嵌入式C语言:什么是共用体?

在嵌入式C语言编程中&#xff0c;共用体&#xff08;Union&#xff09;是一种特殊的数据结构&#xff0c;它允许在相同的内存位置存储不同类型的数据。意味着共用体中的所有成员共享同一块内存区域&#xff0c;因此&#xff0c;在任何给定时间&#xff0c;共用体只能有效地存储…

QT简单实现验证码(字符)

0&#xff09; 运行结果 1&#xff09; 生成随机字符串 Qt主要通过QRandomGenerator类来生成随机数。在此之前的版本中&#xff0c;qrand()函数也常被使用&#xff0c;但从Qt 5.10起&#xff0c;推荐使用更现代化的QRandomGenerator类。 在头文件添加void generateRandomNumb…

【4Day创客实践入门教程】Day2 探秘微控制器——单片机与MicroPython初步

Day2 探秘微控制器——单片机与MicroPython初步 目录 Day2 探秘微控制器——单片机与MicroPython初步MicroPython语言基础开始基础语法注释与输出变量模块与函数 单片机基础后记 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机…

[论文阅读] (37)CCS21 DeepAID:基于深度学习的异常检测(解释)

祝大家新春快乐&#xff0c;蛇年吉祥&#xff01; 《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0…

Java面试题2025-并发编程进阶(线程池和并发容器类)

线程池 一、什么是线程池 为什么要使用线程池 在开发中&#xff0c;为了提升效率的操作&#xff0c;我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务&#xff0c;可以将任务分成几块&#xff0c;分别交给几个线程去执行&#xff0c;最终做一个汇总就可…

【算法应用】基于鲸鱼优化算法求解OTSU多阈值图像分割问题

目录 1.鲸鱼优化算法WOA 原理2.OTSU多阈值图像分割模型3.结果展示4.参考文献5.代码获取 1.鲸鱼优化算法WOA 原理 SCI二区|鲸鱼优化算法&#xff08;WOA&#xff09;原理及实现 2.OTSU多阈值图像分割模型 Otsu 算法&#xff08;最大类间方差法&#xff09;设灰度图像有 L L …

设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解策略模式 在策略模式中&#xff0c;可以定义一些独立的类来封装不同的算法&#xff0c;每个类封装一种具体的算法。在这里&#xff0c;每个封装算法的类都可以称之为一种策略&#xff08;Strategy…

7. 马科维茨资产组合模型+金融研报AI长文本智能体(Qwen-Long)增强方案(理论+Python实战)

目录 0. 承前1. 深度金融研报准备2. 核心AI函数代码讲解2.1 函数概述2.2 输入参数2.3 主要流程2.4 异常处理2.5 清理工作2.7 get_ai_weights函数汇总 3. 汇总代码4. 反思4.1 不足之处4.2 提升思路 5. 启后 0. 承前 本篇博文是对前两篇文章&#xff0c;链接: 5. 马科维茨资产组…

安装Maven(安装包+步骤)

1. 安装: 通过网盘分享的文件&#xff1a;apache-maven-3.9.9 链接: https://pan.baidu.com/s/16AE_brICuw6sS0tC6tmE1Q?pwda74r 提取码: a74r --来自百度网盘超级会员v3的分享 2.新建应该系统变量: 3.path中添加bin文件夹路径 4.建议在这里建一个仓库文件夹 博主的: 5.I…

【云安全】云原生-K8S-搭建/安装/部署

一、准备3台虚拟机 务必保证3台是同样的操作系统&#xff01; 1、我这里原有1台centos7&#xff0c;为了节省资源和效率&#xff0c;打算通过“创建链接克隆”2台出来 2、克隆之前&#xff0c;先看一下是否存在k8s相关组件&#xff0c;或者docker相关组件 3、卸载原有的docker …

单细胞-第四节 多样本数据分析,下游画图

文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…

【算法】动态规划专题① ——线性DP python

目录 引入简单实现稍加变形举一反三实战演练总结 引入 楼梯有个台阶&#xff0c;每次可以一步上1阶或2阶。一共有多少种不同的上楼方法&#xff1f; 怎么去思考&#xff1f; 假设就只有1个台阶&#xff0c;走法只有&#xff1a;1 只有2台阶&#xff1a; 11&#xff0c;2 只有3台…

知识管理平台在数字经济时代推动企业智慧决策与知识赋能的路径分析

内容概要 在数字经济时代&#xff0c;知识管理平台被视为企业智慧决策与知识赋能的关键工具。其核心作用在于通过高效地整合、存储和分发企业内部的知识资源&#xff0c;促进信息的透明化与便捷化&#xff0c;使得决策者能够在瞬息万变的市场环境中迅速获取所需信息。这不仅提…

LabVIEW微位移平台位移控制系统

本文介绍了基于LabVIEW的微位移平台位移控制系统的研究。通过设计一个闭环控制系统&#xff0c;针对微位移平台的通信驱动问题进行了解决&#xff0c;并提出了一种LabVIEW的应用方案&#xff0c;用于监控和控制微位移平台的位移&#xff0c;从而提高系统的精度和稳定性。 项目背…

java求职学习day23

MySQL 单表 & 约束 & 事务 1. DQL操作单表 1.1 创建数据库,复制表 1) 创建一个新的数据库 db2 CREATE DATABASE db2 CHARACTER SET utf8; 2) 将 db1 数据库中的 emp 表 复制到当前 db2 数据库 1.2 排序 通过 ORDER BY 子句 , 可以将查询出的结果进行排序 ( 排序只…