【Python系列】Python装饰器

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【实战JVM】-实战篇-06-GC调优

文章目录 1 GC调优概述1.1 调优指标1.1.1 吞吐量1.1.2 延迟1.1.3 内存使用量 2 GC调优方法2.1 发现问题2.1.1 jstat工具2.1.2 visualvm插件2.1.3 PrometheusGrafana2.1.4 GC Viewer2.1.5 GCeasy 2.2 常见GC模式2.2.1 正常情况2.2.2 缓存对象过多2.2.3 内存泄漏2.2.4 持续FullGC…

【全开源】小区入户安检系统(FastAdmin + Uni-APP)

守护家的每一道防线 一款基于FastAdmin Uni-APP开发的小区入户安检系统(前端可发布为小程序、H5、App)。可针对不同行业自定义安检项目,线下安检,线上留存(安检拍照/录像),提高安检人员安检效率。 一、引言&#xff…

NLP(1)-TF-IDF算法介绍

一、TF-IDF算法介绍 TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。 TF-IDF是一…

升级HarmonyOS 4.2,开启健康生活篇章

夏日来临,华为智能手表携 HarmonyOS 4.2 版本邀您体验,它不仅可以作为时尚单品搭配夏日绚丽服饰,还能充当你的健康管家,从而更了解自己的身体,开启智能健康生活篇章。 高血糖风险评估优化,健康监测更精准 …

Java面向对象笔记

多态 一种类型的变量可以引用多种实际类型的对象 如 package ooplearn;public class Test {public static void main(String[] args) {Animal[] animals new Animal[2];animals[0] new Dog();animals[1] new Cat();for (Animal animal : animals){animal.eat();}} }class …

html 使用svg矢量图时无法 调整宽高问题解决,不能像图片一样设置宽高比例问题

引入的路径后加 #svgView(preserveAspectRatio(none)) 具体代码如下 修改前 <img src"/assets/svgs/full_screen_full.svg" class"im"> 修改后 <img src"/assets/svgs/full_screen_full.svg#svgView(preserveAspectRatio(none))" cla…

前端处理流式数据(SSE服务)

前言 将数据用流的方式返回给客户端,这种技术需求在传统的管理项目中不多见,但是在媒体或者有实时消息等功能上就会用到,这个知识点对于前端还是很重要的。 即时你不写服务端,但是服务端如果给你这样的接口,你也得知道怎么去使用联调。 nodejs实现简单的SSE服务 SSE服务(Se…

Java:流程控制语句

文章目录 一、顺序结构二、分支结构2.1 if2.2 switch 三、循环结构3.1 for3.2 while3.3 do...while 四、流程控制4.1 break4.2 continue 五、结语 一、顺序结构 顺序结构语句是Java程序默认的执行流程&#xff0c;按照代码的先后顺序&#xff0c;从上到下依次执行。 二、分支结…

宏集Panorama SCADA:个性化定制,满足多元角色需求

前言 在考虑不同人员在企业中的职能和职责时&#xff0c;他们对于SCADA系统的需求可能因其角色和工作职责的不同而有所差异。在SCADA系统的设计和实施过程中&#xff0c;必须充分考虑和解决这种差异性。 为了满足不同人员的需求, 宏集Panorama SCADA平台具备灵活的功能和定制…

新书速览|Python Django 4构建动态网站的16堂课

Python Django 4构建动态网站的16堂课 本书内容 《Python Django 4构建动态网站的16堂课》是一本关于Django框架的网站开发入门教材&#xff0c;适合想要学习并掌握Django框架的开发人员阅读。《Python Django 4构建动态网站的16堂课》共分16课&#xff0c;内容包括网站开发环境…

影响指挥中心操作台的材质选择的因素有哪些

指挥中心操作台作为现代指挥系统的重要组成部分&#xff0c;其材质的选择不仅关系到操作台的使用寿命和稳定性&#xff0c;更直接影响到整个指挥中心的运行效率和安全性。因此&#xff0c;对指挥中心操作台的材质设定一系列标准显得尤为重要。 耐用性考量&#xff1a;鉴于指挥中…

Android Dialog使用汇总

Dialog分类 AlertDialog Dialog 类是对话框的基类&#xff0c;官方建议我们不要直接实例化它&#xff0c;而是使用其子类来获取实例。AlertDialog是系统提供的一个直接子类&#xff0c;它能帮助我们快速构建出不同类型的弹窗。接下来就看下各种类型弹窗的使用。 1、普通对话框…

【遗传算法】【机器学习】【Python】常见交叉方法(一)、单点交叉和两点交叉

一、遗传算法流程图 交叉过程即存在于上图的”交叉“&#xff08;crossover&#xff09;步骤中。 二、单点交叉 随机地选择1个交叉位点进行交叉&#xff0c;如下图所示&#xff1a; 用random库实现随机性&#xff1a; import random# 简单的单点交叉方式 def sing_muta(lis…

AI写作革命:毕业论文的新助手

写作这件事一直让我们从小学时期就开始头痛&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;这玩意不…

操作简单中医电子处方中药划价系统软件视频教程,佳易王诊所电子处方管理系统软件

操作简单中医电子处方中药划价系统软件视频教程&#xff0c;佳易王诊所电子处方管理系统软件 一、前言 以下软件操作教程以&#xff0c;佳易王中西医诊所电子处方软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件支持中医和西医处方…

多功能光时域反射仪的工作原理

6426A-2101多功能光时域反射仪是新一代掌上型智能化光纤通信测量仪器&#xff0c;具有强大的功能和广泛的应用领域。它能够显示光纤及光缆的损耗分布曲线图&#xff0c;测量光纤及光缆的多种关键参数&#xff0c;包括长度、损耗、接续质量等&#xff0c;为光纤通信系统的工程施…

leetcode第867题:转置矩阵

matrix[i][j]需要放在转置矩阵的(j,i)位置 public class Solution {public int[][] Transpose(int[][] matrix) {int rows matrix.Length; int columns matrix[0].Length; int[][] array2 new int[columns][];// 初始化内部数组&#xff08;列数&#xff09;for (int i 0…

GAT1399协议分析(六)--校时

一、官方消息定义 DeviceIDType &#xff1a;GA/T1400.1,采集设备、 卡口点位、 采集系统、分析系统、视图库、应用平台等设备编码规则 TimeCorrectModeType&#xff1a; dateTime时间格式&#xff1a; TimeZone&#xff1a;时区&#xff0c;GAT1400里面没有找到具体内容&…

四川菊乐食品IPO终止:收入增速放缓,内控缺陷遭关注,产能过剩

近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;四川菊乐食品股份有限公司&#xff08;下称“菊乐股份”或“菊乐食品”&#xff09;及其保荐人中信建投证券撤回上市申请文件。因此&#xff0c;深圳证券交易所决定终止对该公司首次公开发行股票并在主板上市的审核。…

openGauss系数据库逻辑复制实现双写

本篇关于逻辑复制实现双写的案例&#xff0c;本来准备了3个环境&#xff0c;分别是306、501和505&#xff0c;奈何在5版本向3版本订阅的时候&#xff0c;出现了报错&#xff0c;但也将整个过程都记录下来吧。 环境准备 节点信息 MogDB# select version(); …