Python函数装饰器的用法

Python函数装饰器的用法

文章目录

  • 1.装饰器的优点
  • 2. 使用装饰器前
  • 3. 使用装饰器后

装饰器是Python中一种强大的语法特性,它允许在不修改已有代码的情况下,对函数或类进行增强或修改。装饰器的本质是一个函数,它接受一个函数作为参数,并返回一个新的函数。


1.装饰器的优点

通过使用装饰器,我们可以在不改变原函数定义的情况下,在函数执行前后添加额外的功能。这样做具有以下几个优点:

  1. 代码复用:可以将一些通用的功能抽象出来,作为装饰器应用到多个函数上,避免了重复编写相同的代码。
  2. 解耦合:装饰器将原函数与额外的功能解耦合,使得每个函数只关注自己的核心逻辑,提高了代码的可读性和可维护性。
  3. 可扩展性:通过使用装饰器,我们可以方便地在已有函数上添加新的功能,而不需要修改原函数的定义,从而遵循了开放封闭原则。

下面我们以一个示例来说明装饰器的使用。


2. 使用装饰器前

假设我们有一个计算函数执行时间的需求,在使用装饰器前,可以这样实现:

import time

def my_function():
    # 记录开始时间
    start_time = time.time()
    
    # 模拟函数执行过程
    time.sleep(2)
    print("函数执行完毕")
    
    # 记录结束时间并计算执行时间
    end_time = time.time()
    print(f"函数的执行时间为:{end_time - start_time}秒")
    
# 调用原函数
my_function()

输出结果:
            在这里插入图片描述


3. 使用装饰器后

此外,我们还可以使用装饰器来实现。

import time

# 定义一个装饰器函数
def calculate_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 的执行时间为:{end_time - start_time}秒")
        return result
    return wrapper

# 原函数
@calculate_time
def my_function():
    # 模拟函数执行过程
    time.sleep(2)
    print("函数执行完毕")

# 调用原函数
my_function()

输出结果:
            在这里插入图片描述


在上述代码中,将计算函数执行时间的功能定义为了装饰器函数calculate_time
它接受一个函数作为参数,并返回一个新的函数wrapper
wrapper函数实现了在原函数执行前后记录时间的功能。

通过在原函数my_function之前加上@calculate_time,我们将装饰器应用到了该函数上。当调用my_function时,实际上调用的是装饰后的函数wrapper,它会在执行原函数前后记录时间并打印出来。这样的写法也称装饰器的语法糖写法。

这样以来,原函数的功能和计算执行时间的功能被分离开,计算执行时间的函数被视为拓展功能。想要拓展其他功能只需继续新建其他装饰器函数进行拓展即可,而不必对原函数大动干戈。


通过对比使用装饰器前后的代码,我们可以看到使用装饰器后的代码更加简洁,而且将计算时间的逻辑与原函数分离开来,提高了代码的可读性和可维护性。此外,如果在其他函数中也需要统计执行时间,只需简单地加上装饰器即可,避免了重复编写相同的计时代码。这就是装饰器的优越性所在。

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

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

相关文章

SQL Sever 基础知识 - 数据排序

SQL Sever 基础知识 - 二 、数据排序 二 、对数据进行排序第1节 ORDER BY 子句简介第2节 ORDER BY 子句示例2.1 按一列升序对结果集进行排序2.2 按一列降序对结果集进行排序2.3 按多列对结果集排序2.4 按多列对结果集不同排序2.5 按不在选择列表中的列对结果集进行排序2.6 按表…

koa2项目中封装log4js日志输出

1.日志输出到控制台 npm i log4js -D 封装log4js文件: 注意:每次都要重新获取log4js.getLogger(debug)级别才能生效 const log4js require("log4js");const levels {trace: log4js.levels.TRACE,debug: log4js.levels.DEBUG,info: log4js.…

Youtube如何做SEO关键词挖掘

做好Youtube的SEO优化,可以使我们的视频得到更多的展示,更多的点击和观看,就能获得更多的粉丝和流量。一方面通过视频做引流到目标网站进行转化赚钱,另一方面可以通过涨粉接youtube广告赚钱。要做seo最关键的一步在于关键词的挖掘…

IC设计简单概述

IC设计行业是一个高科技行业,有着复杂而细致的分工,严格的流程规范、多种不同类型的EDA工具。下面简单概述以下几个方面。 IC设计公司的分类 IC设计公司有多种分类方法。若按有无芯片生产能力来分,可以分为兼具设计与生产能力(I…

(Ant X6)子组件里的流程图画布无法显示

(Ant X6)子组件里的流程图画布无法显示 问题背景:侧导航页面都是子组件,建模页面的画布无法显示 解决前: 解决后: 解决思路:点击建模菜单时再次加载对应组件 在 Vue 中,每个组件都有一个唯一的 key 属性。当组件的 ke…

二叉堆的实现

文章目录 堆堆的概念及性质 二叉堆的实现Heap.hHeap.c堆的初始化堆的销毁向堆中插入数据删除堆中的数据找堆顶元素判断堆是否为空Heap.c完整代码 test.c 堆 堆的概念及性质 二叉堆的实现 Heap.h #pragma once #include<stdio.h> #include<stdlib.h> #include<…

SSM校园学习助手系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 校园学习助手系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

HTML—列表、表格、表单

1、列表 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表 1.1 无序列表 作用&#xff1a;布局排列整齐的不需要规定顺序的区域 标签&#xff1a;ul 嵌套 li&#xff0c;ul 是无序列表&#xff0c;li 是列表条目 注意事项&#…

Microsoft Remote Desktop高效、安全、稳定的远程办公解决方案

在今天的数字化时代&#xff0c;Remote Desktop远程办公已成为许多人的日常生活。无论你是因为工作需要&#xff0c;还是因为在家中需要访问公司服务器&#xff0c;微软远程连接软件都是一个理想的选择。 微软远程连接软件Remote Desktop是一款高效、安全、稳定的远程办公解决…

(动手学习深度学习)第13章 实战kaggle竞赛:树叶分类

文章目录 实战kaggle比赛&#xff1a;树叶分类1. 导入相关库2. 查看数据格式3. 制作数据集4. 数据可视化5. 定义网络模型6. 定义超参数7. 训练模型8. 测试并提交文件 竞赛技术总结1. 技术分析2. 数据方面模型方面3. AutoGluon4. 总结 实战kaggle比赛&#xff1a;树叶分类 kagg…

数据库管理-第119期 记一次迁移和性能优化(202301130)

数据库管理-第119期 记一次迁移和性能优化&#xff08;202301130&#xff09; 1 迁移 之前因为DV组件没有迁移成功的那个PDB&#xff0c;后来想着在目标端安装DV组件迁移&#xff0c;结果目标端装不上&#xff0c;而且开了SR也没看出个所以然来。只能换一个方向&#xff0c;尝…

云计算生成式 -给你不一样的音乐推荐新体验

目录 摘要&#xff1a; 正文&#xff1a; 一、亚马逊云与生成式 AI 结合的展望/总结 二、我用亚马逊云科技生成式 AI 产品打造了什么&#xff0c;解决了什么问题 三、未来云端技术发展趋势的见解 四、云端技术未来需要解决的问题 1、如何保护数据安全和隐私&#xff1f; …

虚拟机系列:Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置

Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置 Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置 在更新Oracle VM Virtua…

STC15-串口通信打印输出数据printf函数与sprintf函数

STC15-串口通信打印输出数据printf函数与sprintf函数 1.打印输出数据有二种printf函数与sprintf函数&#xff0c;不同之处有&#xff1a;&#xff08;1&#xff09;函数的声明不同&#xff08;2&#xff09;函数的功能不同&#xff08;3&#xff09;用法举例 该问题引用百度知道…

【面试HOT200】回溯篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot300】进行的&#xff0c;每个知识点的修正和深入主要参…

恒驰服务 | 华为云云上运维服务offering

恒驰运维服务主要针对运维要求高或自身运维能力有限的客户&#xff0c;通过服务增购的形式&#xff0c;提供运维服务以协助客户做好云上资源运维管理&#xff0c;规避业务风险&#xff0c;降低运维开销&#xff0c;提升客户业务稳定性。 适用场景&#xff1a; 如何保障业务稳定…

音乐播放器Swinsian mac功能介绍

Swinsian mac是一款音乐播放器&#xff0c;它的特点是轻量级、快速、易用。Swinsian支持多种音频格式&#xff0c;包括MP3、AAC、FLAC、WAV等。它还具有iTunes集成功能&#xff0c;可以自动导入iTunes音乐库中的音乐&#xff0c;并支持智能播放列表、标签编辑、自定义快捷键等功…

ssh连接docker容器处理备忘

1、查看容器ip&#xff0c;记下来之后要用 docker inspect elastic | grep IPAddress 2、使用root进入docker容器 docker exec -it -u root elastic /bin/bash 3、安装openssh #更新apt apt-get update#安装ssh client apt-get install openssh-client#安装ssh server apt-…

Ps:用好钢笔工具

使用钢笔工具时&#xff0c;应随时注意鼠标指针的形状。 ◆ ◆ ◆ 基本操作方法 1、绘制闭合路径 路径绘制结束时回到起点即可创建闭合路径。 2、绘制开放路径 想结束绘制时&#xff0c;按住 Ctrl 键点击画布空白处&#xff0c;或者&#xff0c;直接按 Esc 键&#xff0c;即可…