Python高级用法:装饰器(decorator)

news2024/12/23 14:19:16

装饰器(decorator)

Python装饰器的作用是使函数包装与方法包装(一个函数,接受函数并返回其增强函数)变得更容易阅读和理解。最初的使用场景是在方法定义的开头能够将其定义为类方法或静态方法。
不使用装饰器的代码如下所示

类方法不用装饰器的写法

class WithoutDecorators:
	def some_static_method():
	 	print("this is static method")
	some_static_method = staticmethod(some_static_method)

 	def some_class_method(cls):
 		print("this is class method")
 	some_class_method = classmethod(some_class_method)

函数不用装饰器的写法

def decorated_function():
	pass

decorated_function = some_decorator(decorated_function)

如果用装饰器语法重写的话,代码会更简短,也更容易理解:

类方法使用装饰器的写法

class WithDecorators:
	@staticmethod
	def some_static_method():
		print("this is static method")

	@classmethod
	def some_class_method(cls):
		print("this is class method")

函数使用装饰器的写法

@some_decorator
def decorated_function():
	pass

装饰器通常是一个命名的对象,在装饰函数时接受单一参数,并返回另一个可调用(callable)对象,任何实现了__ call __方法的可调用对象都可以用作装饰器,它们返回的对象往往也不是简单的函数,而是实现了自己的__ call __方法的更复杂的类的实例。

任何函数都可以用作装饰器,Python没有规定装饰器的返回类型。所以使用单一参数但不返回可调用对象的函数用作装饰器,在语法上是完全有效的。如果调用这样装饰过的对象就会报错。

自定义装饰器

以函数形式创建

def mydecorator(function):
	def wrapped(*args, **kwargs):
		# 在调用原始函数之前,做点什么
		result = function(*args, **kwargs)
		# 在函数调用之后,做点什么,
		# 并返回结果
		return result
		# 返回wrapper作为装饰函数
	return wrapped

mydecorator传入的function是函数,在mydecorator中定义了一个函数wrapped,在wrapped函数中args和kwargs参数是原函数function的参数,装饰器使用wrapped来对函数进行修饰,所以装饰器返回的也是wrapped

以类的形式创建

class DecoratorAsClass:
	def __init__(self, function):
		self.function = function
	
	def __call__(self, *args, **kwargs):
		# 在调用原始函数之前,做点什么
		result = self.function(*args, **kwargs)
		# 在调用函数之后,做点什么,
		# 并返回结果
		return result

在这个类中self.function为需要修饰的函数,在__call__方法中定义对self.function的修饰

参数化装饰器

在实际代码中通常需要使用参数化的装饰器。如果用函数作为装饰器的话,需要用到第二层函数嵌套包装。

def repeat(number=3):
	def actual_decorator(function):
		def wrapper(*args, **kwargs):
			result = None
			for _ in range(number):
				result = function(*args, **kwargs)
			return result
		return wrapper
	return actual_decorator

在这里构建的是多次重复执行的装饰函数,number参数为重复次数,默认值是3

我们来测试一下参数化的装饰器

在这里插入图片描述

保存内省的装饰器

使用装饰器的常见问题是使用装饰器时不保存函数元数据,尤其是文档字符串和原始函数名。装饰器组合创建了一个新函数,并返回一个新对象,但却完全没有考虑原始函数的标识。这将会使得调试这样装饰过的函数更加困难,也会破坏可能用到的大多数自动生成文档的工具,因为无法访问原始的文档字符串和函数签名。我们来看一下细节。假设我们有一个虚设的(dummy)装饰器,仅有装饰作用,还有其他一些被装饰的函数:

def dummy_decorator(function):
	def wrapped(*args, **kwargs):
		"""包装函数内部文档。"""
		return function(*args, **kwargs)
	return wrapped

@dummy_decorator
def function_with_important_docstring():
	"""这是我们想要保存的重要文档字符串。"""
	Pass

在这里插入图片描述

解决这个问题的正确方法是使用functools模块内置的wraps()装饰器

from functools import wraps

def preserving_decorator(function):
	@wraps(function)
	def wrapped(*args, **kwargs):
		"""包装函数内部文档。"""
		return function(*args, **kwargs)
	return wrapped

@preserving_decorator
def function_with_important_docstring():
	"""这是我们想要保存的重要文档字符串。"""
	pass

测试效果如下
在这里插入图片描述

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

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

相关文章

MyBatis-config.xml配置文件

1、基本介绍: mybatis的核心配置文件(mybatis-config.xml),比如配置jdbc连接信息,注册mapper等等,我们需要对这个配置文件有详细的了解。 官网地址有详细介绍 mybatis – MyBatis 3 | 配置 2、properties属性 在通常的情况下&am…

Java企业电子招投标系统源代码,支持二次开发,采用Spring cloud框架

在数字化采购领域,企业需要一个高效、透明和规范的管理系统。通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术,我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力,通过待办消息、招标公告、中标公告和信息发布等功能模块…

Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一&…

普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯)

简介 实现PWM呼吸灯。 主芯片 STM32F103ZET6呼吸灯引脚 : PC7电路原理图 LED8 电路图 LED8 与 主芯片连接图 其他知识 公式 PWM周期公式: Tpwm ( (ARR 1) * (PSC 1) ) / Tclk Tclk为定时器的输入时钟频率 Tout则为定时器溢出时间 ARR为计数周期 PSC为预分频器的值…

对房价数据集进行处理和数据分析

大家好,我是带我去滑雪,每天教你一个小技巧! 房价数据集通常包含各种各样的特征,如房屋面积、地理位置、建造年份等。通过对数据进行处理和分析,可以更好地理解这些特征之间的关系,以及它们对房价的影响程度…

【MySQL】orderby/groupby出现Using filesort根因分析及优化

序 在日常的数据库运维中,我们可能会遇到一些看似难以理解的现象。比如两个SQL查询语句,仅仅在ORDER BY子句上略有不同,却造成了性能的天壤之别——一个飞速完成,一个则让数据库崩溃。今天就让我们围绕这个问题,深入剖…

Jmeter 性能压测 —— 常见问题

1、怎么确定系统最大负载? 通过负载测试,不断增加用户数,随着用户数的增加,各项性能指标也会相应产生变化,当出现了性能拐点。 比如,当用户数达到某个数量级时,响应时间突然增长,那…

20240102使用python3将视频切片改名之后合并

20240102使用python3将视频切片改名之后合并 2024/1/2 22:12 缘起:将迅雷下载的视频切片排序之后再通过ffmpeg合并!https://pri-cdn-tx.xiaoeknow.com/app1cE7gLFM1187/confusion_index/1703599111EAPoRE.m3u8?signf17e1a2cc0ddd77801f3c5110116369e&am…

让Windows系统加速引导的六种方法,值得你去尝试

如果你厌倦了在电脑启动到Windows的时间内解决鲁比克方块问题,那么可能会有一些问题需要解决。以下是一些加快引导过程的方法,这样你就可以更快地开始工作(或玩)。 启用Windows的快速启动模式 Windows有一个名为“快速启动”的功能,它可以完全按照它字面的方式启动,所以…

git rebase应用场景三

文章目录 git rebase应用场景三 git rebase应用场景三 在我们的开发分支中 假设我们修改一个文件 提交一个版本 再回到master分支 同时也去修改1.txt文件,提交一个版本 这样相当于master分支提交了一次,dev也提交了一次 然后回到dev分支 此时会报错…

【办公技巧】RAR文件分卷压缩如何设置?

一个rar压缩包体积太大了,想要将压缩包分为三个,该如何做到?其实很简单,方法就在我们经常使用的WinRAR当中。 我们先将压缩包内的文件解压出来,然后查看一下,然后打开WinRAR软件,找到文件&…

基于多元宇宙算法优化的Elman神经网络数据预测 - 附代码

基于多元宇宙算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于多元宇宙算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于多元宇宙优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

鸿蒙崛起:互联网大厂加速鸿蒙原生应用开发,人才争夺战打响

随着华为鸿蒙系统的发布和不断推进,一场以鸿蒙为中心的生态竞争已经拉开帷幕。近日,网易、美团等多家互联网公司发布了与鸿蒙系统有关的岗位招聘,加速推进鸿蒙原生应用开发转型。这种趋势表明,鸿蒙系统已经引起了行业的广泛关注&a…

selenium+python自动化测试之环境搭建

最近由于公司有一个向谷歌网站上传文件的需求,需要进行web的自动化测试,选择了selenium这个自动化测试框架,以前没有接触过这门技术,所以研究了一下,使用python来实现自动化脚本,从环境搭建到实现脚本运行。…

Docker(八)Python+旧版本chrome+selenium+oss2+fastapi镜像制作

目录 一、背景二、能力三、核心流程图四、制作镜像1.资源清单2.Dockerfile3.制作镜像 五、启动测试 一、背景 近几年我们线下的创业团队已从零到一开发过好几个小程序项目,都是和体育相关。其中生成海报分享图片好像都是不可或缺的功能。之前的项目老板给的时间都比…

达梦数据库报错 执行失败(语句1) -2111: 第1 行附近出现错误: 无效的列名[system]

[TOC](达梦数据库报错 执行失败(语句1) -2111: 第1 行附近出现错误: 无效的列名[system]) 1、报错现象 执行下列sql语句 UPDATE "TEST"."TEST_1" SET "TEST_1"."SALT"123456 where "TEST_1"."ID""system&…

Amazon Lex揭示大语言模型与生成式AI的未来发展

Amazon Lex的产品经理Marcelo Silva与总经理Ganesh Geller以及洛克希德马丁公司的研究员和首席架构师Greg Doppelhower在re:Invent开发者大会中分享了关于大语言模型与生成式AI的最新进展。演讲强调了如何利用Amazon Lex以及与Amazon Connect的完全集成平台,为员工和…

Java中的类和方法(方法重载)

目录 前言: 什么是面向对象? 什么是类? 类和方法的关系: 方法的定义: 方法重载: 类的定义: 修改类的名字: 实例化: 利用方法对其属性赋值: this…

【电脑优化】win10、win11限制cpu处理器最大频率

文章目录 背景步骤总结 背景 近两年的笔记本性能提升很大,然而动辄5000的风扇转速,就跟直升机起飞一样,容易让人遭受声波攻击。所以,在此介绍一下win10、win11下通过注册表限制cpu最大频率的办法。步骤 winr输入regedit打开注册…

海外软文发稿:海外媒体软文发稿的重要性与优势

随着信息技术的蓬勃发展催生了海外发稿的蓬勃发展,这不仅促进了国际交流,更加深了人们对世界各领域的了解。海外发稿通过传递多样信息,将人们引向政治事件、文化现象、科技突破和社会变革等多个领域,使人们对这些领域的发展有了更…