Python函数装饰器的用法

news2024/11/16 12:27:25

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,它会在执行原函数前后记录时间并打印出来。这样的写法也称装饰器的语法糖写法。

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


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

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

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

相关文章

激光科学六十年

1960年5月16日,在查尔斯汤斯(Charles Townes)和阿瑟肖洛(Arthur Schawlow)以及其他许多人早期工作的基础上,西奥多迈曼(Theodore Maiman)发射了第一台工作激光器:粉红红宝…

Java常用类(String相关类)-8

目录 包装类 装箱和拆箱 包装类型和String的转换,包装类的常用方法 Java_String 两种创建方式解析 测试 常用方法 Java_StringBuffer String和StringBuffer的转换 常用方法 Java_StringBuilder 包装类 装箱和拆箱 package com.edu.wrapper;public class …

ELK+filebeat+kafka

无需创建logstash的端口,直接创建topic 远程收集mysql和httpd的日志 (一)安装nginx和mysql服务 1、打开mysql的日志功能 2、创建日志(创库、创表、添加数据) (1)mysql服务器上安装http system…

软件开发流程:基础源代码与实战详解

一、引言 在当今的信息时代,软件开发已成为推动社会进步和发展的重要力量,从智能手机应用程序到复杂的企业级系统,软件开发在我们的日常生活和工作中发挥着越来越重要的作用。 然而,对于初学者来说,了解软件开发流程…

Python链式调用技巧:代码流畅无缝连接

更多资料获取 📚 个人网站:ipengtao.com 链式调用是一种编程风格,它允许将多个方法调用连接在一起,形成一个连贯的操作链。在Python中,链式调用常常用于使代码更简洁、易读,尤其在处理数据处理和函数式编程…

深入了解Java8新特性-日期时间API之ChronoUnit、ChronoField

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概3000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

【人工智能Ⅰ】实验6:回归预测实验

实验6 回归预测实验 一、实验目的 1:了解机器学习中数据集的常用划分方法以及划分比例,并学习数据集划分后训练集、验证集及测试集的作用。 2:了解降维方法和回归模型的应用。 二、实验要求 数据集(LUCAS.SOIL_corr-实验6数据…

Python list列表添加元素的3种方法及删除元素的3种方法

Python list列表添加元素的3种方法 Python list 列表增加元素可调用列表的 append() 方法,该方法会把传入的参数追加到列表的最后面。 append() 方法既可接收单个值,也可接收元组、列表等,但该方法只是把元组、列表当成单个元素,这…

LeetCode(45)最长连续序列【哈希表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 最长连续序列 1.题目 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&a…

目标检测——SPPNet算法解读

论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun 链接:https://arxiv.org/abs/1406.4729 目录 1、算法概述2、Deep Networks with Spatia…

vue3使用动态component

使用场景: 多个组件通过component标签挂载在同一个组件中,通过触发时间进行动态切换。vue3与vue2用法不一样,这里有坑! 使用方法: 1.通过vue的defineAsyncComponent实现挂载组件 2.component中的is属性 父组件&am…

企业数字化转型应对传统网络挑战的关键策略

数字化变革正在以前所未有的速度和规模改变着我们的生活和工作方式,使得传统网络架构面临着巨大的挑战。其中包括带宽需求增加、多云应用增加、安全威胁增加以及传统网络设备无法满足需求等问题。 数字化时代需要更高速、更可靠、更安全的网络支持,传统网…

Python基础语法之学习字符串格式化

Python基础语法之学习字符串格式化 一、代码二、效果 一、代码 # 通过m.n控制 a 123 b 123.444 c 123.555 print("限制为5:%5d" % a) print("限制为2:%2d" % a) print("限制为5.2:%5.2f" % b) print("限制为5.2:%5.2f" % c)二、效…

商家门店小程序怎么做?门店小程序的优势和好处

生活服务类商家在当前数字化时代,越来越认识到门店小程序的重要性。门店小程序不仅为商家提供了一个在线展示的窗口,更为其打造了一个与消费者直接互动的平台。有了门店小程序,商家可以更加便捷地管理商品信息、订单流程,同时还能…

LRU缓存淘汰策略的实现——LinkedHashMap哈希链表

LRU(最近最少使用)缓存淘汰策略可以通过使用哈希链表实现。LinkedHashMap 是 Java 中提供的一种数据结构,它综合了哈希表和双向链表的特点,非常适合用来实现 LRU 缓存。 LinkedHashMap 内部维护了一个哈希表和一个双向链表。哈希…

WSL中安装的Pycharm如何在Windows的开始菜单中新建图标?或WSL中的Pycharm经常花屏

WSL中安装的Pycharm如何在Windows的开始菜单中新建图标?或WSL中的Pycharm经常花屏 ⚙️1.软件环境⚙️🔍2.问题描述🔍🐡3.解决方法🐡🤔4.结果预览🤔 ⚙️1.软件环境⚙️ Windows10 教育版64位 W…

建设银行新余市分行积极开展国债下乡宣传活动

近日,为了普及国债知识,提高农村居民对国债的认知度和投资意识,建设银行新余市分行组织员工前往下村开展了一场国债下乡宣传活动。 活动当天,工作人员早早地来到了下乡地点,悬挂起了国债宣传横幅,并摆放了…

学习k8s的介绍(一)

一、kubernetes及Docker相关介绍 1、kubernetes是什么 1-1、简称为k8s或kube,是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 声明式配置语法: kubectl create/apply/delete -f xx…

VS Code C++可视化调试配置Natvis,查看Qt、STL变量内容

VS Code C可视化调试配置Natvis 使用GlobalVisualizersDirectory Windows下 C:\Users\YourName\.vscode\extensions\ms-vscode.cpptools-1.18.5-win32-x64\debugAdapters\vsdbg\bin\Visualizers\Linux下 ~\.vscode\extensions\ms-vscode.cpptools-1.18.5-win32-x64\debugAd…

CANDENCE: PCB 如何高亮网络、器件

PCB 如何高亮网络、器件 开始前先学习一个单词:assign CANDECE 高亮网络 step1: 选择一个颜色:红色 step2: 筛选要高亮什么:网络 or 器件,这里选择网络。 step3:鼠标点击要高亮的网络: 这里是GND 这里…