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

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.niftyadmin.cn/n/5839312.html

相关文章

第十一章 F - H 开头的术语

文章目录 第十一章 F - H 开头的术语文件流 (file stream)最终类 (final class)最终方法 (final method)最终属性 (final property)外键 (foreign key)基础 (foundation) 以 G 开头的术语全局 (global)全局数据库 (globals database)全局目录 (global directory)全局唯一标识符…

CSS 中调整元素大小的全面指南

CSS 中调整元素大小的全面指南 1. 原始尺寸&#xff08;固有尺寸&#xff09;示例代码&#xff1a;图像的固有尺寸 2. 设置具体的尺寸示例代码&#xff1a;设置固定宽度和高度 3. 使用百分比示例代码&#xff1a;使用百分比设置宽度 4. 使用百分比作为外边距和内边距示例代码&a…

《苍穹外卖》项目学习记录-Day7缓存菜品

我们优先去读取缓存数据&#xff0c;如果有就直接使用&#xff0c;如果没有再去查询数据库&#xff0c;查出来之后再放到缓存里去。 微信小程序根据分类来展示菜品&#xff0c;所以每一个分类下边的菜品对应的就是一份缓存数据&#xff0c;这样的话当我们使用这个数据的时候&am…

EtherCAT主站IGH-- 25 -- IGH之fsm_slave_scan.h/c文件解析

EtherCAT主站IGH-- 25 -- IGH之fsm_slave_scan.h/c文件解析 0 预览一 该文件功能`fsm_slave_scan.c` 文件功能函数预览二 函数功能介绍`fsm_slave_scan.c` 中主要函数的作用1. `ec_fsm_slave_scan_state_start`2. `ec_fsm_slave_scan_state_address`3. `ec_fsm_slave_scan_stat…

(动态规划路径基础 最小路径和)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}…

Day30-【AI思考】-错题分类进阶体系——12维错误定位模型

文章目录 错题分类进阶体系——12维错误定位模型**一、认知层错误&#xff08;根源性缺陷&#xff09;****二、操作层错误&#xff08;执行过程偏差&#xff09;****三、心理层错误&#xff08;元认知障碍&#xff09;****四、进阶错误&#xff08;专业级陷阱&#xff09;** 错…

24.Word:小李-黑客技术【7】

目录 NO1.2.3.4 NO5.6​ NO7.8.9​ NO1.2.3.4 另存为&#xff1a;考生文件夹没有B5则&#xff1a;文件→打印→打印机&#xff08;更换打印机&#xff09;布局→纸张大小&#xff1a;B5&#xff08;JIS)→页面设置对话框→页边距&#xff1a;左右→装订线&#xff1a;1cm→页…

leetcode 2300. 咒语和药水的成功对数

题目如下 数据范围 示例 注意到n和m的长度最长达到10的5次方所以时间复杂度为n方的必然超时。 因为题目要求我们返回每个位置的spell对应的有效对数所以我们只需要找到第一个有效的药水就行&#xff0c;这里可以先对potions排序随后使用二分查找把时间复杂度压到nlogn就不会…