【Python系列】Python装饰器

news2024/11/16 7:54:48

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 1.装饰器的概念
    • 2.装饰器的构成
    • 3.装饰器的语法
    • 4.带参数的装饰器
    • 5.装饰器的应用场景
    • 6.示例:日志记录装饰器
    • 7.装饰器的高级用法
    • 8.结论

装饰器(Decorator)是 Python 中一种非常强大的功能,它允许程序员在不修改原始函数代码的前提下,增加函数的新功能。装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个经过包装的函数,从而增强原有函数的功能。
在这里插入图片描述

1.装饰器的概念

在 Python 中,装饰器通常用@符号来表示,它位于函数定义之前。装饰器可以看作是一种设计模式,它遵循开放-封闭原则,即软件实体应该对扩展开放,对修改封闭。装饰器允许你通过增加新的功能来扩展函数,而不需要修改函数本身的代码。

2.装饰器的构成

一个装饰器通常包含以下三部分:

  1. 接收函数的函数:这是装饰器本身,它接收一个函数作为参数。
  2. 包装函数:这是装饰器内部定义的函数,它会调用接收到的函数,并可以添加额外的功能。
  3. 返回包装函数:装饰器执行完毕后,需要返回一个函数,通常是包装函数。

3.装饰器的语法

装饰器的基本语法如下:

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 在这里添加额外的功能
        result = original_function(*args, **kwargs)
        # 在这里添加额外的功能
        return result
    return wrapper_function

@decorator_function
def original_function(*args, **kwargs):
    # 函数的原始功能
    pass

4.带参数的装饰器

有时候,我们希望装饰器本身也能接收参数,这就需要使用到闭包。带参数的装饰器语法如下:

def decorator_function_with_args(arg1, arg2):
    def decorator(original_function):
        def wrapper(*args, **kwargs):
            # 使用装饰器参数
            print(arg1, arg2)
            result = original_function(*args, **kwargs)
            return result
        return wrapper
    return decorator

@decorator_function_with_args('arg1_value', 'arg2_value')
def original_function():
    pass

5.装饰器的应用场景

装饰器可以用于多种场景,包括但不限于:

  1. 日志记录:在函数执行前后添加日志记录。
  2. 性能测试:测量函数执行时间。
  3. 事务处理:确保数据库操作的原子性。
  4. 缓存:缓存函数的返回结果,避免重复计算。
  5. 权限校验:检查用户是否有执行函数的权限。
  6. 请求限流:限制函数在一定时间内的调用次数。

6.示例:日志记录装饰器

下面是一个简单的日志记录装饰器示例:

import functools
import time

def log_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} executed in {end_time - start_time:.2f} seconds")
        return result
    return wrapper

@log_decorator
def add(a, b):
    time.sleep(1)  # 模拟耗时操作
    return a + b

result = add(5, 3)

7.装饰器的高级用法

除了基本用法,装饰器还可以用于类和类方法,甚至可以嵌套使用。此外,Python 标准库中的functools.wraps装饰器可以用来保留原函数的元数据,如函数名、文档字符串等。
在这里插入图片描述

8.结论

装饰器是 Python 中一个非常强大的工具,它提供了一种灵活、优雅的方式来增强函数的功能。通过使用装饰器,我们可以编写更加模块化、可重用的代码,同时保持代码的清晰和简洁。掌握装饰器的使用,对于提高 Python 编程技能和编写高质量代码具有重要意义。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

Spring AI 第二讲 之 Chat Model API 第二节Ollama Chat

通过 Ollama,您可以在本地运行各种大型语言模型 (LLM),并从中生成文本。Spring AI 通过 OllamaChatModel 支持 Ollama 文本生成。 先决条件 首先需要在本地计算机上运行 Ollama。请参阅官方 Ollama 项目 README,开始在本地计算机上运行模型…

使用PyCharm 开发工具创建工程

一. 简介 前面学习了 安装 python解释器。如何安装python的一种开发工具 PyCharm。 本文来简单学习一下,如何使用 PyCharm 开发工具创建一个简单的 python工程。 二. PyCharm 开发工具创建一个工程 1. 首先,首先打开PyCharm 开发工具。选择 创建一…

【计算机毕业设计】谷物识别系统Python+人工智能深度学习+TensorFlow+卷积算法网络模型+图像识别

谷物识别系统,本系统使用Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经算法网络模型,通过对11种谷物图片数据集(‘大米’, ‘小米’, ‘燕麦’, ‘玉米渣’, ‘红豆’, ‘绿豆’, ‘花生仁’, ‘荞麦’, ‘黄豆’, …

白银票据~

一. 白银票据的原理 白银票据就伪造ST票据, kerberoasting是破解ST票据中的服务用户hash值,有以下区别: 白银票据:伪造的ST使用的是机器用户的Hash值 Kerberoasting:破解的是ST的域用户的hash值二. 白银票据的利用条件 1.域名 …

[数据集][目标检测]旋风检测数据集VOC+YOLO格式157张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):159 标注数量(xml文件个数):159 标注数量(txt文件个数):159 标注类别…

【机器学习】GBDT (Gradient Boosting Decision Tree) 深入解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 GBDT (Gradient Boosting Decision Tree) 深入解析引言一、GBDT基础理论1.1 梯度…

C++——从C语言快速入门

目录 一、数组 1、声明数组 2、初始化数组 3、访问数组元素 4、示例 5、注意事项 6、数组小练习 计算器支持加减乘除 数组找最大值 二、指针 三、字符串 string 类型 一、数组 在 C 中,数组是一种存储固定大小的相同类型元素的序列。数组的所有元素都存…

Django中使用Celery和APScheduler实现定时任务

在之前的文章我们已经学习了Celery和APScheduler的基本使用,下面让我们来了解一下如何在Django中使用Celery和APScheduler Celery 1.前提工作 python 3.7 pip install celery pip install eventlet #5.0版本以下 pip install importlib-metadata4.8.3&#xff08…

批量修改文件

最近几个月的文章都直接发在公众号上,没有同步到博客上,想去同步时发现已经有不少了,一个个修改太麻烦了。 之前没规划好,所以博客文章都是直接放在仓库一个目录下,数量多了之后,有点乱,不好管…

工业交换机如何防止广播风暴

工业交换机作为网络设备的重要组成部分,在网络中起到了连接各个设备和传输数据的重要作用。然而,广播风暴是工业交换机面临的一个常见问题,会影响网络性能和稳定性。为了防止广播风暴的发生,工业交换机可以采取一系列有效的措施。…

[数据集][目标检测]吉他检测数据集VOC+YOLO格式66张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):66 标注数量(xml文件个数):66 标注数量(txt文件个数):66 标注类别数…

qt中使用QSLite时发现query.value(0).toInt()未获取数据问题

1、首先确保数据库名没有问题 2、确保正常连接 3、非常重要的一点:query.value(0).toInt()之前,必须要有query.first(),非常重要,缺少了这个会一直查不到

ruoyi-nbcio基于jeecg的flowable前端支持自定义表单组件的自动获取方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

什么时候需要用到 @EnableWebSecurity 注解?

有小伙伴在学习 Spring Security 的遇到一个问题: 箭头所指的位置报红,也就是 Spring 容器中没有找到一个类型为 HttpSecurity 的 Bean。 小伙伴说如果他在配置类上加 EnableWebSecurity 注解,就不报错;不加该注解则会报错。那么…

如何快速定位到影响mysql cpu飙升的原因——筑梦之路

通常我们只需要执行show processlist 进行查看,一般执行时间最长的SQL八九不离十就是罪魁祸首,但当show processlist的输出有近千条,那么很难第一眼就发现有问题的SQL,那么如何快速找到呢?其实也非常简单。我们知道mys…

什么样的男士内裤比较好?按这个方法选男士内裤不会出错!

男士内裤作为日常穿着的重要服饰,其舒适度与卫生性对男士们的健康至关重要。随着时代的变迁,男士内裤的款式与材质也日益丰富多样,为男士们提供了更多选择。 目前市场上,男士内裤主要分为三角、平角和四角三大类别。其中&#xf…

直播商城源码-PC+APP+H5+小程序现成源码

随着电商行业的不断演进,直播商城已成为连接消费者和商品的新兴桥梁。直播商城源码提供了一个完整的解决方案,使得企业能够迅速搭建起一个覆盖PC、APP、H5和小程序的全渠道电商平台。本文将探讨直播商城源码的优势、关键功能以及如何选择适合的现成源码。…

ai对话虚拟人app有哪些?一起来看看这3款

ai对话虚拟人app有哪些?在当前的科技浪潮中,AI对话虚拟人app已经成为我们日常生活中的得力助手。它们不仅提供了更加智能、便捷的交流和信息服务,还让我们能随时随地与AI伙伴进行深度互动。这些app的广泛应用,不仅提升了我们的生活…

目标检测数据集 - 海洋垃圾检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:海洋垃圾检测数据集,真实拍摄海洋海底场景高质量垃圾检测图片数据,涉及场景丰富,比如海底塑料垃圾数据、海底铁制品罐状垃圾数据、海底纸张垃圾数据、海洋生物和海底垃圾同框数据、海底探索仪器和海底垃圾同框数据、海…

期刊的分类与级别

在学术界,期刊的分类与级别构成了一个评价学术成果和学者贡献的重要标准,同时也是学术出版与学术交流的基础。然而,对于初涉学者来说,理解期刊的分类与级别可能并不直观。本文旨在提供一个系统性的解释,并阐述为何期刊…