python总结-装饰器

装饰器

  • 装饰器解决日志问题(分三个版本)
  • 多个装饰器
  • 带参数的装饰器
  • wraps装饰器
  • 内置装饰器
    • property装饰器
    • staticmethod装饰器
    • classmethod装饰器
  • 类装饰器

在这里插入图片描述
概念
装饰器来自 Decorator 的直译。什么叫装饰,就是装点、提供一些额
外的功能。在 python 中的装饰器则是提供了一些额外的功能。

装饰器本质上是一个Python函数(其实就是闭包),它可以让其他
函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返
回值也是一个函数对象。
装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、
缓存、权限校验等场景。

装饰器解决日志问题(分三个版本)

v1.0版本解决

def fun1():print("使用功能1")print("日志记录")
def fun2():print("使用功能2")print("日志记录")

v2.0版本解决

def writeLog():print("日志纪录")
def fun1():print("使用功能1")writeLog()
def fun2():print("使用功能2")writeLog()  

v3.0版本解决

def outfunc(func):def infunc():func()print("日志纪录")return infunc
def fun1():print("使用功能1")
def fun2():print("使用功能2")fun1 = outfunc(fun1)
# 装饰器(闭包)
fun1()

v4.0版本解决,装饰器

def outfunc(func):def infunc():func()print("日志纪录")return infunc
@outfunc
def fun1():print("使用功能1")
@outfunc
def fun2():print("使用功能2")
fun1()
fun2()

修改变量名,见名知意

def mylog(func):def infunc():func()print("日志纪录")return infunc
@mylog
def fun1():print("使用功能1")
@mylog
def fun2():print("使用功能2")
fun1()
fun2()

增加参数处理,可以装饰任意多个参数的函数

 def mylog(func):def infunc(*args,**kwargs):func(*args,**kwargs)print("日志纪录")return infunc@mylogdef fun1():print("使用功能1")@mylogdef fun2(a,b):print(f"使用功能2:{a},{b}")fun1()fun2(100,200)

装饰器本质上是一个Python函数(其实就是闭包),它可以让其他
函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返
回值也是一个函数对象。
装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、
缓存、权限校验等场景。

多个装饰器

有时候,我们需要多个装饰器修饰一个函数。比如:需要增加日志
功能、增加执行效率测试功能。
装饰器函数的执行顺序是分为(被装饰函数)定义阶段和(被装饰
函数)执行阶段的,装饰器函数在被装饰函数定义好后立即执行

在函数定义阶段:执行顺序是从最靠近函数的装饰器开始,自内而外的执行
在函数执行阶段:执行顺序由外而内,一层层执行
import timedef mylog(func):print("mylog start")def infunc():print("日志纪录 start")func()print("日志纪录 end")print("mylog end")return infuncdef cost_time(func):print("cost time start")def infunc():print("开始计时..")start = time.time()func()end = time.time()print(f"耗费时间:{end-start}")return end-startprint("cost time end")return infunc@mylog@cost_time# 相当于:# fun2 = cost_time(fun2)# fun2 = mylog(fun2)# 也相当于:# fun2 = mylog(cost_time(fun2))def fun2():print("使用功能2")time.sleep(2)print("使用功能22")fun2()

执行结果:

cost time start
cost time end
mylog start
mylog end
日志纪录 start
开始计时…
使用功能2
使用功能22
耗费时间:2.004323959350586
日志纪录 end

带参数的装饰器

# coding=utf-8
# 带参数的装饰器的典型写法
def mylog(type):def decorator(func):def infunc(*args,**kwargs):if type=="文件":print("文件中:日志纪录")else:print("控制台:日志纪录")return func(*args,**kwargs)return infuncreturn decorator
@mylog("文件")
def fun2(a,b):print("使用功能2",a,b)
if __name__ == '__main__':fun2(100,200)

wraps装饰器

一个函数不止有他的执行语句,还有着 name (函数名), doc
(说明文档)等属性,我们之前的例子会导致这些属性改变。
functool.wraps 可以将原函数对象的指定属性赋值给包装函数对象,默认
有module、name、doc,或者通过参数选择。

# coding=utf-8
from functools import wraps
def mylog(func):@wraps(func)def infunc(*args,**kwargs):print("日志纪录...")print("函数文档:",func.__doc__)return func(*args,**kwargs)return infunc@mylog   # fun2 = mylog(fun2)
def fun2():"""强大的功能2"""print("使用功能2")if __name__ == '__main__':fun2()print("函数文档--->",fun2.__doc__)"""
运算结果:
日志纪录...
函数文档: 强大的功能2
使用功能2
函数文档---> 强大的功能2
"""

内置装饰器

常用 三种装饰器: property 、 staticmethod 、classmethod 。

property装饰器

property 装饰器用于类中的函数,使得我们可以像访问属性一样来获
取一个函数的返回值。

class User:def __init__(self,name,month_salary):self.name = nameself.month_salary = month_salary@propertydef year_salary(self):return int(self.month_salary)*12
if __name__ == '__main__':u1 = User("gaoqi","30000")print(u1.year_salary)

staticmethod装饰器

staticmethod 装饰器同样是用于类中的方法,这表示这个方法将会是一
个静态方法,意味着该方法可以直接被调用无需实例化,但同样意
味着它没有 self 参数,也无法访问实例化后的对象。

class Person:@staticmethoddef say_hello():print("hello world!")if __name__ == '__main__':Person.say_hello()

classmethod装饰器

classmethod 这个方法是一个类方法。该方法无需实例化,没有 self 参
数。相对于 staticmethod 的区别在于它会接收一个指向类本身的 cls 参
数。

class Person:@classmethoddef say_hello(cls):print(f"我是{cls.__name__}")print("hello world!")
if __name__ == '__main__':Person.say_hello()

类装饰器

上面写的装饰器都是函数来完成的。我们用类也可以实现装饰器。
类能实现装饰器的功能, 是由于当我们调用一个对象时,实际上调
用的是它的 _ _call_ _ 方法。

class Demo:def __call__(self):print('我是 Demo')
demo = Demo()
demo()  # 直接调用对象,实质是调用了他的__call__()

缓存装饰器和计时装饰器综合练习

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

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

相关文章

一个可能的网址服务器证书自动续期自动化实现脚本方案

需求背景: 目标: 您希望为您的网站启用HTTPS,以保护通信安全,并希望这个过程是免费的。 证书类型: 您需要获取SSL/TLS证书,并且希望证书能够自动续期,以确保网站不会因证书过期而停机。 服务器兼容性: 您希望生成的证…

idea2023连接gitee远程仓库

目录 1.在gitee创建远程仓库 2.在Idea里配置git 3.初始化本地仓库 4. 提交推送至远程仓库 注意:提前下好git工具、idea2023,注册gitee账号,本文不介绍 1.在gitee创建远程仓库 创建好后,复制远程仓库地址 2.在Idea里配置git ​ …

【MATLAB源码-第104期】基于matlab的MPSK和MQAM调制解调方式仿真,输出误码率曲线。

操作环境: MATLAB 2022a 1、算法描述 MPSK(多相位键控) MPSK是一种基于载波相位变化的数字调制技术。它的核心原理是通过改变载波的相位来表示不同的数字信息。这种技术可以分为几个不同的级别,其中最常见的包括: 1…

【书生·浦语大模型实战营02】《轻松玩转书生·浦语大模型趣味Demo》学习笔记

《轻松玩转书生浦语大模型趣味Demo》 1、InternLM-Chat-7B 智能对话:生成 300 字的小故事 本节中我们将使用InternLM-Chat-7B 模型部署一个智能对话 Demo。 1.1 环境准备 在InternStudio平台中选择 A100(1/4) 的配置,镜像选择 Cuda11.7-conda&#x…

Rust组织下的其他项目介绍

按当前star数排序 rustlings https://rustlings.cool/ Rustlings是一个用于学习Rust编程语言的项目,提供小练习帮助熟悉Rust代码的阅读和编写。 需要安装Rust,然后可以使用提供的命令来运行练习并修复其中的错误。项目还提供了一些额外的学习资源&#x…

Linux系统使用超详细(八)~磁盘管理

目录 一、认识磁盘 二、磁盘运行机制 三、磁盘检查 3.1查找设备名称和分区号 3.1.1使用lsblk命令: 3.1.2使用fdisk命令: 3.1.3使用blkid命令: 3.2检查方向 3.2.1文件系统完整性: 3.2.2磁盘健康状态: 3.2.3磁…

# 2024年 外形自我改造计划(A)

2024年 自我改造计划(A) 一、前言 希望能在2024实现浴火重生,在这一年里我记录一下自我改造计划 二、生活习惯篇 生活习惯是决定一个人状态的关键要素,为了保持我的状态的持续,我需要保证我拥有一个相对良好的生活…

JDBC*

*JDBC数据库连接步骤 1.将JDBC驱动的jar添加到项目的依赖中。 2.加载JDBC驱动 例如: Class.forName("com.mysql.jdbc.Driver"); 3.连接数据库 例如: Connection con DriverManager.getConnection(URL,us…

html5实现好看的个人博客模板源码

文章目录 1.设计来源1.1 主界面1.2 认识我界面1.3 我的文章界面1.4 我的模板界面1.5 文章内容界面 2.结构和源码2.1 目录结构2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/135368653 html5实现好看…

C语言第三方库Melon开箱即用之词法分析器使用

之前的文章中,笔者介绍了Linux/UNIX C语言库Melon的基本功能及框架使用。 本文将介绍Melon中的词法分析器组件。 Melon的Github仓库为:https://github.com/Water-Melon/Melon 词法分析器在Melon中并不依赖于自身框架,因此可以在不初始化框…

Core Web Vitals

Core Web Vitals 是 Google 提出的一组用于衡量网页用户体验质量的指标。它们专注于三个方面:加载性能(Largest Contentful Paint,LCP)、交互性(First Input Delay,FID)和视觉稳定性&#xff08…

2024 年江苏省职业院校技能大赛高职软件测试赛项规程

2024 年江苏省职业院校技能大赛高职软件测试赛项规程 需要竞赛资源可私信博主! 一、赛项名称 赛项编号:JSG202429 赛项名称:软件测试 赛项组别:高职学生组、高职教师组赛项归属专业大类:电子信息 二、竞赛目的 软件是…

详解Keras3.0 Callbacks API : TensorBoard(可视化工具)

TensorBoard TensorBoard是TensorFlow提供的可视化工具。需要安装TensorFlow才能使用此回调。此回调记录TensorBoard的事件,包括:度量汇总图、训练图可视化、重量直方图、采样剖面。 keras.callbacks.TensorBoard(log_dir"logs",histogram_…

vue3防抖函数封装与使用,以指令的形式使用

utils/debounce.js /*** 防抖函数* param {*} fn 函数* param {*} delay 暂停时间* returns */ export function debounce(fn, delay 500) {let timer nullreturn function (...args) {// console.log(arguments);// const args Array.from(arguments)if (timer) {clearTim…

docker部署simpleDocker

1,安装docker,请参考 linux安装docker 2,安装docker-compose,请参考 Docker-Compose 3,安装simpleDocker 准备docker-compose.yml文件 version: 3 services:redis:container_name: redisimage: redis:latestweb:conta…

imgaug库指南(八):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…

Linux top命令教程:实时监控系统状态和进程(附实例详解和注意事项)

Linux top命令介绍 top命令(Table of Processes)是Linux中用来监视系统运行状态和查看系统中运行的进程的实时动态管理命令。它可以显示系统的总体信息,包括运行时间、负载、运行的进程数、CPU使用率、内存使用率等。 Linux top命令适用的L…

mysql原理--事务

1.事务的起源 对于大部分程序员来说,他们的任务就是把现实世界的业务场景映射到数据库世界。比如银行为了存储人们的账户信息会建立一个 account 表: CREATE TABLE account (id INT NOT NULL AUTO_INCREMENT COMMENT 自增id,name VARCHAR(100) COMMENT …

java 常⽤的线程池模式ScheduledThreadPool

用于定时或周期性地执行任务。 可以设置任务的延迟执行时间或执行周期。 使用场景:适用于需要定时执行任务的应用程序,如定时清理缓存、定时发送邮件等。 import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorServ…

excel统计分析——两因素有重复方差分析

参考资料:生物统计学 无重复观测值的两因素方差分析只能研究两个因素的主效应,不能考察因素间的交互作用,只有在确定因素间不存在交互作用时才能进行无重复观测值的试验和分析。为了准确估计因素的主效应、交互作用和随机误差,每个…