强大而灵活的python装饰器

装饰器(Decorators)

一、概述

在Python中,装饰器是一种特殊类型的函数,它允许我们修改或增强其他函数的功能,而无需修改其源代码。装饰器在函数定义之后立即调用,并以函数对象作为参数。装饰器返回一个新的函数对象,这个新函数对象通常会“包装”或“装饰”原函数,并在调用时执行额外的操作。

二、基本用法

装饰器的基本语法是使用@符号,后面紧跟装饰器函数的名称。装饰器函数通常接收一个函数作为参数,并返回一个新的函数。

@decorator_function  
def my_function():  
    pass

在上面的代码中,decorator_function是一个装饰器,它接收my_function作为参数,并返回一个新的函数对象。这个新的函数对象在调用时会执行decorator_function中定义的代码,并在适当的时候调用my_function

三、装饰器函数

装饰器函数通常接收一个函数作为参数,并返回一个新的函数。装饰器函数内部的新函数通常会调用原函数,并在调用前后执行额外的操作。

def decorator_function(func):  
    def wrapper(*args, **kwargs):  
        # 在原函数执行前执行的代码  
        print("Before function call")  
          
        # 调用原函数  
        result = func(*args, **kwargs)  
          
        # 在原函数执行后执行的代码  
        print("After function call")  
          
        return result  
      
    return wrapper

四、使用装饰器

使用装饰器非常简单,只需在函数定义之前加上@符号和装饰器函数的名称即可。

@decorator_function  
def my_function():  
    print("Inside function")  
  
# 调用被装饰的函数  
my_function()

五、使用装饰器的测试示例

下面是一个使用装饰器来实现基准测试的示例:

import time  
from functools import wraps  
  
def benchmark(func):  
    """  
    基准测试装饰器,用于测量函数的执行时间。  
  
    参数:  
        func (callable): 要测试的函数。  
  
    返回:  
        callable: 装饰后的函数,它会打印原始函数的执行时间。  
    """  
    @wraps(func)  
    def wrapper(*args, **kwargs):  
        start_time = time.time()  
        result = func(*args, **kwargs)  
        end_time = time.time()  
          
        elapsed_time = end_time - start_time  
        print(f"执行 {func.__name__} 花费了 {elapsed_time:.6f} 秒")  
        return result  
      
    return wrapper  
  
# 示例函数,我们将对其应用基准测试装饰器  
@benchmark  
def example_function(n):  
    sum = 0  
    for i in range(n):  
        sum += i  
    return sum  
  
# 调用示例函数,装饰器会自动打印执行时间  
print(example_function(1000000))

在这个例子中,benchmark 是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数 wrapperwrapper 函数会记录开始和结束时间,然后调用原始函数并打印出执行时间。@wraps(func) 是一个内置装饰器,用于保留原始函数的元信息(如函数名、文档字符串等)。

通过在 example_function 定义之前使用 @benchmark 装饰器,我们告诉Python在调用 example_function 时实际上要调用的是 wrapper 函数,而 wrapper 函数会记录并打印出 example_function 的执行时间。

使用装饰器的好处是你可以在不修改原始函数的情况下轻松添加新功能,例如基准测试。这使得代码更加模块化且易于维护。

六、装饰器的高级用法

1、多个装饰器

一个函数可以同时使用多个装饰器,只需在函数定义前依次列出它们即可。

@decorator1  
@decorator2  
def my_function():  
    pass

2、带参数的装饰器

装饰器本身也可以接收参数,并在内部定义装饰器函数。

def outer_decorator(param):  
    def decorator_function(func):  
        def wrapper(*args, **kwargs):  
            print(f"Before function call with param: {param}")  
            result = func(*args, **kwargs)  
            print(f"After function call with param: {param}")  
            return result  
          
        return wrapper  
      
    return decorator_function  
  
@outer_decorator("hello")  
def my_function():  
    print("Inside function")  
  
my_function()

七、注意事项

  • 装饰器会改变函数的名称和文档字符串,除非使用@wraps装饰器来保留这些信息。
  • 装饰器会改变函数的签名,这可能会影响依赖于函数签名的工具或库。
  • 装饰器可能会增加函数的调用开销,因为每次调用被装饰的函数时,都会执行额外的代码。

八、总结

装饰器是Python中一种强大而灵活的工具,它允许我们在不修改函数源代码的情况下,为函数添加额外的功能。通过正确使用装饰器,我们可以提高代码的可读性、可维护性和可扩展性。

文心大模型3.5生成

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

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

相关文章

Docker容器与虚拟化技术:OpenEuler 部署 docker容器应用

目录 一、实验 1.环境 2.OpenEuler 安装 docker 2.镜像加速 3.docker部署LAMP 二、安装docker报错 2.docker如何快速删除容器与镜像 3.docker创建mysql容器失败 4.docker创建apache容器失败 5.docker创建php-fpm容器失败 6. 80端口与php访问失败 7.httpd容器进入不…

【刷题】Leetcode 1609.奇偶树

Leetcode 1609.奇偶树 题目描述广度优先搜索(BFS)深度优先算法(DFS) 思路一(BFS)思路二(DFS)Thanks♪(・ω・)ノ谢谢阅读!!&a…

【k8s管理--Helm包管理器】

1、Helm的概念 Kubernetes包管器 Helm是查找、分享和使用软件构件Kubernetes的最优方式。 Helm管理名为chart的Kubernetes包的工具。Helm可以做以下的事情: 从头开始创建新的chat将chart打包成归档tgz)文件与存储chat的仓库进行交互在现有的Kubernetes集群中安装和…

【数据库管理系统】Mysql 8.0.36入门级安装

下载地址 官方网址:MySQL 注意事项 建议不要安装最新版本,一般找mysql5.0或mysql8.0系列版本即可;mysq1官网有.zip和.msi两种安装形式;zip是压缩包,直接解压缩以后使用的,需要自己配置各种东西&#xff…

模型优化_如何提高网络/模型的泛化能力?(全面)

目录 1. 以数据为中心的泛化方法 1.1 使用更多数据 1.2 做好数据预处理 特征工程 1.3 数据增强 1.4 调整数据分布 2. 以模型为中心的泛化方法 2.1 使用更大批次 超参数调优 2.2 调整目标函数 2.3 调整网络结构 2.4 屏蔽网络节点 2.5 权值正则化 2.6 偏差-方差权衡…

计算机网络_2.2物理层下面的传输媒体

2.2物理层下面的传输媒体 一、传输媒体的分类二、导向型传输媒体1、同轴电缆2、双绞线3、光纤(1)光纤通信原理(2)光纤组成(4)多模光纤与单模光纤对比(5)光纤的波长与规格&#xff08…

自测-1 打印沙漏

文章预览: 题目算法代码 题目 算法 以前做过这个,那次是c语言写的,一点一点处理一层一层完成,这次我换了一种语言用了另一种思想使用递归去写,还是我们要先求出应该有多少层这个很容易,中间输出部分我们算…

Linux系统中安装redis+redis后台启动+常见相关配置

1、下载Redis Redis官网:https://redis.io/ 历史版本: http://download.redis.io/releases 2、连接Linux(或者VMwear) 我们安装的是linux版本的redis 打开xftp我们需要先将我们的Redis上传到服务器上 解压到这里 解压的指令 …

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测 目录 回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BiTCN基于双向时间卷积网络的数据回归预测(完整源码和数据&a…

SpringBoot原理-配置优先级(黑马学习笔记)

配置优先级 在我们前面的课程当中,我们已经讲解了SpringBoot项目当中支持的三类配置文件: ● application.properties ● application.yml ● application.yaml 在SpringBoot项目当中,我们要想配置一个属性,可以通过这三种方…

CDN原理探究

来源于百度: https://baike.baidu.com/item/%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C/4034265?frge_ala 通过上图,我们可以了解到,使用了CDN缓存后的网站的访问过程变为: 用户向浏览器提供要访问的域名&#xff…

【Unity】构建简单实用的年份选择器(简单原理示范)

在许多应用程序和游戏中,年份选择是一个常见的需求。无论是在日历应用程序中查看事件,还是在历史类游戏中选择时间段,年份选择器都是用户体验的重要组成部分,下面实现一个简易的年份选择器。 一、效果预览: 目录 一、…

浅谈mysql mvcc

目录 前言 mvcc 是如何工作的? 数据的更新 前言 mvcc 与一个事物的隔离级别有关,未提交读永远读的是当前值,串行化是通过加锁实现,这两种隔离级别都与mvcc 没有任何关系。只要一提到mvcc应该想到的是读提交以及可重复读&#…

Node.js中的缓存策略和缓存技巧

在Node.js中,缓存策略和缓存技巧是提升应用性能和用户体验的关键因素。通过有效地利用缓存,我们可以显著减少系统资源的消耗,加快数据访问速度,从而提升整体的网站性能。本文将针对Node.js中的缓存策略和缓存技巧展开深入探讨&…

php PhpSpreadsheet 读取日期变数字问题解决

问题描述: 使用PhpSpreadsheet 读取表格数据,日期格式读取后变成数字,如下图: 解决方案: $cell $sheet->getCell(H . $row)->getValue(); $toTimestamp \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimes…

CentOS安装GUI图形界面

CentOS安装图形界面 CentOS minimal环境安装图形界面。 列出所有可用的Environment Groups yum group list yum groupinfo "GNOME Desktop"选择GNOME Desktop软件包组进行安装 yum groupinstall -y GNOME Desktop1 如果要通过GUI配置网络需要安装Server with GU…

深入理解Java泛型及其在实际编程中的应用

第1章:泛型的起源与重要性 大家好,我是小黑,在Java里,泛型(Generics)是一种不可或缺的特性,它允许咱们在编码时使用类型(Type)作为参数。这听起来可能有点绕&#xff0c…

倒模专用制作耳机壳UV树脂:改性丙烯酸树脂

倒模专用制作耳机壳的UV树脂是经过改性的丙烯酸树脂,具有高透明度、高粘度、快速固化的特点。这种树脂可以通过紫外线光固化,快速形成坚硬的表面,并且具有较高的硬度和耐磨性,因此非常适合用于制作耳机壳。 此外,改性丙…

anaconda简介以及安装(Windows)

介绍 Anaconda是一个开源的Python发行版本,它是一个打包的集合,里面预装了conda、Python、众多packages、科学计算工具等。Anaconda的目的是方便使用Python进行数据科学研究,它涵盖了数据科学领域常见的Python库,并且自带了专门用…

SpringBoot 整合WebService

文章目录 WebService1.简单介绍WebService1.1. 类型1.2. 架构1.3. 主要特点1.4. 使用场景1.5. Web服务标准和技术 2.案例-WebServiceDemo2.1.引入配置文件2.2.创建接口2.3.创建接口实现类2.4.创建WebService配置类2.5.测试 WebService Web服务(Web Services&#xf…