python使用类装饰器生成函数的使用日志

news2025/1/11 6:58:06

1 什么是类装饰器

在了解类装饰器之前,建议大家先了解装饰器的概念。
装饰器知识快速入门链接
类装饰器是 Python 中的一种特殊类型的装饰器,它是一个类而不是一个函数。与函数装饰器不同,类装饰器可以在运行时接收参数并返回一个可调用的对象,而不是直接替换被装饰的函数。

类装饰器的语法是在装饰器类名前面加上 @ 符号,后跟被装饰的函数。它需要实现一个 __init__ 方法来接收被装饰的函数,以及一个 __call__ 方法来替代函数的行为。对于熟悉装饰器的同学来说,类装饰器的__call__其实就是装饰器的内层函数。

类装饰器常用于在运行时动态修改函数的行为,例如记录函数调用日志,缓存函数返回值,检查函数参数等。

2 类装饰器建立流程

  1. 定义一个类,该类需要实现一个 init 方法来接收被装饰的函数。

  2. 定义一个 call 方法来替代被装饰函数的行为。

  3. 使用 @ 符号将类装饰器类名标记在被装饰函数前面。

与装饰器类似,类装饰器的使用方法如下:

@decorator_class
def decorated_function():
    pass

其中 decorator_class 是一个类,它实现了 __init__ __call__ 方法, decorated_function 是被装饰的函数。

在使用类装饰器时需要注意的是,类装饰器的实例是在导入模块时创建的,而不是在调用函数时创建的。这意味着如果类装饰器类中定义了状态,那么所有使用该装饰器的函数将共享该状态。

3 类装饰器示例代码

为了更好的了解类装饰器,我们来看一段包含类装饰器的完整代码。在这个类装饰器中,实现了生成被装饰函数的使用日志这一常用功能。

"""
类装饰器实现了一个 __call__ 方法来记录函数的使用日志。这个装饰器记录函数运行的开始时间和结束时间,并打印出来。
使用类装饰器时,需要注意的是,类装饰器需要实现一个 __call__ 方法来替代函数的行为。此外,类装饰器需要实现一个 __init__ 方法来接收被装饰的函数。
"""
import datetime
import time


class LoggingDecorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        start_time = datetime.datetime.now()
        result = self.func(*args, **kwargs)
        end_time = datetime.datetime.now()
        print(f'{self.func.__name__} ran from {start_time} to {end_time}')
        return result


@LoggingDecorator
def my_function():
    time.sleep(1)
    print('Hello, World!')


my_function()

这段函数的输出如下:
在这里插入图片描述
虽然这里我们定义的my_function()函数并没有传参进去,但是类装饰器的__call__方法仍然传入了(*args, **kwargs),这使得我们这个装饰器同样可以作用于带参数的函数。
如果希望将日志保存下来,可以将print函数部分进行替换成如下内容:

        with open('log.txt','a',encoding='utf-8') as f:
            f.write(f'{self.func.__name__} ran from {start_time} to {end_time}')

这样,就可以将每次的输出保存在一个文本文件中。

4 原理解释

在定义装饰器的时,等同于以后在执行函数时,将执行

LoggingDecorator(my_function())

即将函数传入了装饰器类。
在之后执行my_function()方法(或理解为类方法)时,__call__方法便会被自动执行,因此类装饰器发挥了作用。

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

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

相关文章

Linux文件系统(IO缓冲区+磁盘+软硬链接)

目录 一、缓冲区 1.1 缓冲区是内存的一块存储空间 1.2 缓冲区的作用 1.3 C式缓冲区 1.3.1 C语言的FILE结构体 1.3.2 C式缓冲区刷新策略 二、OS与内核缓冲区 2.1 数据从缓冲区到磁盘 2.2 fsync() 数据免缓冲直接到磁盘文件 2.3 检验用户与内核缓冲区 三、文件系统 3…

11. 好客租房-ElasticSearch入门学习

Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来…

分享144个ASP源码,总有一款适合您

ASP源码 分享144个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 144个ASP源码下载链接:https://pan.baidu.com/s/15O9p6a8XlNN0u-wFKEkJqQ?pwd8354 提取码&#x…

Go 语言

Go语言是云计算时代的语言 Go语言2007年诞生于Google,2009年开源,Go语言与区块链技术一样年轻 本文是对Go语言基本语法的总结 目录 Go词法单元 token Go的token 标识符 内置数据类型标识符 常量值标识符 空白标识符 关键字 程序整体结构的关键字…

VBA提高篇_05日期时间函数

文章目录日期函数1. Date()2. Time()3. Now()时间数据解析函数时间运算函数DateDiff() 数据时间差DateAdd() 时间点指定跨越拓展日期函数 VBA中默认日期系统格式: #1/26/2023 12:20:25 # #月/日/年 时:分:秒# 1. Date() 获取当前系统的时间(年/月/日) 精度: 精确到秒 范围: 公…

Tomcat-HTTP服务器介绍、安装与使用

文章目录一、概述二、下载安装三、介绍四、启动Tomcat一、概述 Tomcat,是一个 HTTP 服务器,就是在 TCP 服务器的基础上,加上了一些额外的功能。使用 HTTP 服务器的 API。就可以来提取HTTP请求的内容,也可以构造HTTP响应 二、下载…

【GPLT 二阶题目集】L2-015 互评成绩

学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输入格式&#xff…

HBase原理和设计

简介 HBase —— Hadoop Database的简称,Google BigTable的另一种开源实现方式,从问世之初,就为了解决用大量廉价的机器高速存取海量数据、实现数据分布式存储提供可靠的方案。从功能上来讲,HBase不折不扣是一个数据库&#xff0…

EcoStruxure Operator Terminal Expert 操作员终端专家

EcoStruxure Operator Terminal Expert(以前称为 Vijeo XD)是一款具有最新 UI 设计和手势的触摸屏配置软件,使您能够为 Magelis HMI 和 iPC 创建和编辑应用程序屏幕。 特点: 变量——内存中用于存储数据的命名空间。创建您需要的所…

MS-Model【3】:Medical Transformer

文章目录前言1. Abstract & Introduction1.1. Abstract1.2. Introduction2. Medical Transformer (MedT)2.1. Model structure2.2. Attention2.2.1. Self-Attention Overview2.2.2. Axial-Attention2.2.3. Gated Axial-Attention2.3. Local-Global Training2.4. Loss funct…

定位 position属性 相对定位 绝对定位 固定定位 定位下的居中 多个定位元素重叠时 补充

目录定位position属性相对定位绝对定位固定定位定位的做法: 定位下的居中多个定位元素重叠时补充定位 视觉格式化模型,大体上将页面中盒子的排列分为三种方式: 常规流浮动:float定位:position 定位:手动…

MySQL —— 数据类型

目录 一、数据类型的分类 二、数值类型 1. tinyint类型 2. bit类型 3. float类型 4. decimal类型 三、字符串类型 1. char类型 2. varchar类型 3. char和varchar的比较 四、时间日期类型 五、enum和set类型 一、数据类型的分类 分类数据类型说明数值类型BIT(M)位…

《深入浅出计算机组成原理》学习笔记 Day11

浮点数1. 浮点数的二进制转化2. 浮点数的加法和精度损失参考1. 浮点数的二进制转化 以 9.1109.1_{10}9.110​ 为例。910100129_{10} 1001_2910​10012​,再把小数位转换为二进制。以 0.100120.1001_20.10012​ 为例: 0.1001212−102−202−312−40.562…

吊打大厂:内核级安卓系统优化软件 | 雪豹速清app官网下载

雪豹速清app是当前非常热门的一款安卓系统垃圾清理优化工具,具有雪豹文件管理器、大文件查找、冗余文件/重复文件清理、安卓内核级垃圾清理、QQ微信专清、文件秒搜、M3U8视频合并、微信语音导出、伪装音视频查找、安装包提取等诸多特色实用功能,雪豹速清…

LCR TC1 测试仪

用于检测NPN PNP 晶体管 电阻 电容二极管 三极管 NMOS PMOS IGBT JFET 可控硅 红外波形 ,具有自校准功能。我手里的是TC-V2.12k 版本红外检测方法 :红外遥控器对准接收口,然后按下发送 即可检测 检测出 usercode 和datacode产品参数1.8寸屏幕…

Python内置包Tkinter的重要控件(上)

学习了这么久的Tkinter,基本上把Tkinter的重要控件都学了一遍,本文主要对其所有重要控件以及重要函数做一个总结,加深对Tkinter的理解与应用。 目录 前言 控件 1. Label 2. Button 3. Entry 4. Text 5. Menu 总结 前言 包括但不限…

MyBatis(一)MyBatis概述

一、什么是框架 ● 在文献中看到的framework被翻译为框架 ● java常用的框架: SSM三大框架:SpingSpringMVCMyBatisSpringBootSpringCloud● 框架其实就是对通用代码的封装,提前写好了一堆接口和类,我们可以在做项目的时候直接引…

Golang学习日志 ━━ gin-vue-admin前后端实现tinymce编辑器的上传功能

gin-vue-admin是一套国人用golang开发的后台管理系统,总体还是值得推荐的,其前端使用element-ui,后端使用gin框架。 官网:https://www.gin-vue-admin.com/ 本文主要描述tinymce的使用,很简单,基本流程如下&…

【Git】Git 的基本使用

Git的简介 Git是一个版本管理控制系统(缩写VCS),是一个工具,github或者gitee是git命令行工具的网站化。它可以在任何时间点,将文档的状态作为更新记录保存起来,也可以在任何时间点,将更新记录恢复回来。 git的诞生历…

Java 方法

文章目录1. 方法的定义和调用2. 带参方法的定义和调用3. 带返回值方法的定义和调用4. 方法的注意事项5. 方法重载6. 方法的参数传递1. 方法的定义和调用 方法是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集。 注意: ① 方法必须先…