Python装饰器的用途和实例

news/2024/7/7 19:46:22

说明

装饰器是Python中非常有用的工具,它们可以用于修改或扩展函数或类的行为,而无需修改其原始定义。装饰器通常是一个函数,它接受一个函数作为参数,并返回一个新的函数或类。下面我们将介绍一些常见的装饰器用途和示例。

  1. 记录日志

装饰器可以用于记录函数的调用信息,比如函数的名称、参数和返回值等。这对于调试和性能分析非常有用。以下是一个简单的记录日志的装饰器示例:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function: {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} returned: {result}")
        return result
    return wrapper

@logger
def add(a, b):
    return a + b

result = add(2, 3)  # 输出:Calling function: add
                    #      Function add returned: 5

  1. 输入验证

装饰器可以用于验证函数的输入参数是否符合要求,如果不符合,则抛出异常或进行其他处理。以下是一个简单的输入验证装饰器示例:

def validate_input(func):
    def wrapper(*args, **kwargs):
        for arg in args:
            if not isinstance(arg, int):
                raise ValueError("Invalid input: integers required")
        for value in kwargs.values():
            if not isinstance(value, int):
                raise ValueError("Invalid input: integers required")
        return func(*args, **kwargs)
    return wrapper

@validate_input
def multiply(a, b):
    return a * b

result = multiply(2, 3)  # 返回:6
result = multiply(2, "3")  # 抛出异常:ValueError: Invalid input: integers required

  1. 缓存结果

装饰器可以用于缓存函数的计算结果,避免重复计算,提高执行效率。以下是一个简单的缓存结果装饰器示例:

import functools

def memoize(func):
    cache = {}
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        key = args + tuple(sorted(kwargs.items()))
        if key not in cache:
            cache[key] = func(*args, **kwargs)
        return cache[key]
    return wrapper

@memoize
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

result = fibonacci(50)  # 返回:12586269025

  1. 权限检查

装饰器可以用于检查用户权限,确保只有具有特定权限的用户才能调用某些函数。这在Web应用程序中特别有用,可以帮助确保用户只能访问其具有权限的资源。以下是一个简单的权限检查装饰器示例:

def check_permission(func):
    def wrapper(*args, **kwargs):
        if user_has_permission():
            return func(*args, **kwargs)
        else:
            raise PermissionError("User does not have permission to access this resource")
    return wrapper

@check_permission
def delete_file(file_path):
    # 删除文件的代码
    pass

  1. 性能分析

装饰器可以用于对函数的性能进行分析,比如计算函数的执行时间、调用次数等信息。这对于优化程序性能非常有帮助,可以帮助开发人员找到程序的瓶颈所在。以下是一个简单的性能分析装饰器示例:

import time
def profile_performance(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} took {end_time - start_time} seconds to execute")
        return result
    return wrapper

@profile_performance
def heavy_computation():
    # 执行耗时计算的代码
    pass

总结

通过上述示例,我们可以看到装饰器的强大功能。它们可以帮助我们轻松地修改和扩展函数或类的行为,而无需对其进行直接修改。装饰器在Python中被广泛使用,因为它们使代码更加模块化、可复用和易于维护。希望本文能够帮助大家理解装饰器的用途和实例,并在实际项目中灵活运用它们。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述


http://lihuaxi.xjx100.cn/news/1901077.html

相关文章

云渲染服务器是什么东西?视频云渲染需不需要购买服务器吗?

随着数字媒体产业的兴起&#xff0c;云渲染技术逐渐成为电影、动画、视频游戏等领域中的关键技术。但云渲染究竟是什么&#xff0c;以及我们是否真的需要在视频和动画制作中使用云渲染服务器?接下来&#xff0c;我们将深入了解这一在互联网上被传得颇为神秘的技术。 一、云渲染…

JVM基础扫盲

什么是JVM JVM是Java设计者用于屏蔽多平台差异&#xff0c;基于操作系统之上的一个"小型虚拟机"&#xff0c;正是因为JVM的存在&#xff0c;使得Java应用程序运行时不需要关注底层操作系统的差异。使得Java程序编译只需编译一次&#xff0c;在任何操作系统都可以以相…

springboot(ssm儿童慈善管理系统 儿童捐赠平台 Java系统

springboot(ssm儿童慈善管理系统 儿童捐赠平台 Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数…

常见几种加密算法的Python实现

一、MD5加密 全称&#xff1a;MD5消息摘要算法&#xff08;英语&#xff1a;MD5 Message-Digest Algorithm&#xff09;&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&…

如何选择最合适的数据库,帮助企业及个人业务更好的开展

选择正确的数据库类型来满足特定的业务需求可能很棘手&#xff0c;但我们随时为您提供帮助。 提供全面的产品和解决方案&#xff0c;助力您的业务发展。我们广泛的云数据库解决方案组合支持所有主流开源数据库、部分商用数据库&#xff0c;可分为五类&#xff1a; 云数据库专用…

Appium微信小程序自动化之开启webview调试功能方法封装

一、前置说明 Appium在微信小程序自动化时&#xff0c;需要开启微信的webview调试功能&#xff0c;以方便对webview的元素进行定位。 二、操作步骤 import timefrom appium.webdriver.common.appiumby import AppiumBy from appium.webdriver.common.touch_action import To…

js中国标准时间转换

一、将中国标准时间转换为 例如 2023-12-18 08:00:00 // 获取今天的日期let today new Date();// 设置 beginDate 为今天的上午8点let beginDate new Date(today.getFullYear(), today.getMonth(), today.getDate(), 8, 0, 0, 0);// 设置 finishDate 为 beginDate 的后三天的…

JVM-7-经典垃圾收集器

Serial收集器 这个收集器是一个单线程工作的收集器&#xff0c;但它的“单线程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作&#xff0c;更重要的是强调在它进行垃圾收集时&#xff0c;必须暂停其他所有工作线程&#xff0c;直到它收集结束。…