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

装饰器(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():passdecorated_function = some_decorator(decorated_function)

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

类方法使用装饰器的写法

class WithDecorators:@staticmethoddef some_static_method():print("this is static method")@classmethoddef 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 = functiondef __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 = Nonefor _ in range(number):result = function(*args, **kwargs)return resultreturn wrapperreturn 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 wrapsdef 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.mzph.cn/news/593598.shtml

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

相关文章

杨中科.NET Core 教程 第一部分-2- .NET Core的重要问题

.NETCore 和 .NETFramework区别 尽管绝大部分用法都没变,但是.NET Core不是 .NET Framework的升级版,无法直接升级 用Mono,.NET Framework程序可以直接运行在Linux下。有了Mono,为啥微软还搞.NET Core? .NET Framework缺点&am…

主干网络篇 | YOLOv8 更换骨干网络之 ResNet50/ResNet101 | 原论文一比一复现

论文地址:https://arxiv.org/abs/1512.03385v1 更深层的神经网络更难以训练。我们提出了一个残差学习框架,以便于训练比以往使用的网络更深层的网络。我们明确地将层重构为学习相对于层输入的残差函数,而不是学习无参考的函数。我们提供了全面的实证证据,表明这些残差网络…

Unity 欧盟UMP用户隐私协议Android接入指南

Unity 欧盟UMP用户协议Android接入指南 官方文档链接开始接入mainTemplate.gradle 中引入CustomUnityPlayerActivity 导入UMP相关的包java类中新增字段初始化UMPSDK方法调用![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d882171b068c46a1b956e80425f3a9cf.png)测…

1月3日,每日信息差

第一、美国年度LNG出口量首登全球第一,美国2023年出口了9120万吨LNG,超过澳大利亚和卡塔尔成为全球最大的LNG出口国。美国LNG出口增加,主要得益于德州自由港LNG工厂重启。自由港LNG是美国最大的天然气出口商,该工厂在2022年6月发生…

【技能---onnxruntime (C++/CUDA) 编译安装制定版本及部署】

文章目录 onnxruntime安装编译基础编译环境要求克隆ONNX Runtime源代码仓库配置和构建ONNX Runtime安装ONNX Runtime onnxruntime安装编译 主要介绍C版本的onnxruntime安装编译及其使用 基础编译环境要求 不同版本ONNXRuntime C对于cmake版本有不同的需求。 例如&#xff1a…

java实现大文件分片上传

背景: 公司后台管理系统有个需求,需要上传体积比较大的文件:500M-1024M;此时普通的文件上传显然有些吃力了,加上我司服务器配置本就不高,带宽也不大,所以必须考虑多线程异步上传来提…

mfc100u.dll文件丢失,有五种不同解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“找不到mfc100u.dll文件”。那么,mfc100u.dll文件到底是什么?为什么会出现丢失的情况?本文将详细介绍mfc100u.dll文件的作用以及丢失的原因,并…

Anaconda下载与超安装详解教程

1 Anaconda 1.1 简介 Anaconda 指的是一个开源的 Python 发行版本,其包含了 conda、Python等180多个科学包及其依赖项。 因为包含了大量的科学包,Anaconda 的下载文件比较大(约 477MB),如果只需要某些包,…

编程笔记 html5cssjs 022 HTML表单概要

编程笔记 html5&css&js 022 HTML表单概要 一、<form> 元素二、HTML Form 属性小结 网页光是输出没有输入可不行&#xff0c;因为输出还是比输入容易&#xff0c;所有就先接触输出&#xff0c;后学习输入。html用来输入的东西叫“表单”。 HTML 表单用于搜集不同类…

安全与认证Week4

目录 本章需要理解的问题 历年题还出现 Web Security (TLS/SSL) 关于网络 使用网络会受到的威胁 各层安全协议 S/MIME、PGP&#xff08;后面和S/MIME一起出现&#xff09;、Kerberos、TLS/SSL 和 IP/IPSec 分别是&#xff1a; S/MIME (Secure/Multipurpose Internet Mail Exten…

cartographer切换地图显示问题,临时解决方案

注意:该方案只在2张地图的子图数量不同时才有效,即通过检测子图的不同来清除路径变量,是临时的解决方案,正确的思路应该再写一个话题或服务通知rviz更新数据 附代码 void SubmapsDisplay::processMessage(const ::cartographer_ros_msgs::SubmapList::ConstPtr& msg)…

DsPdf:GcPdf 7.0 for NET Crack

DsPdf:GcPdf 7.0 用于全面文档控制的功能丰富的 C# .NET PDF API 库 PDF 文档解决方案&#xff08;DsPdf&#xff0c;以前称为 GcPdf&#xff09;可让您快速、高效地生成文档&#xff0c;且无需依赖任何内存。 在 C# .NET 中生成、加载、编辑和保存 PDF 文档 支持多种语言的全…

VMWARE ESXi存储多路径策略修改

一、存储多路径介绍 VMware 路径选择插件 (PSP) 负责选择 I/O 请求的物理路径。插件是 VMware NMP 的子模块。NMP 根据设备类型为每个逻辑设备分配默认 PSP。每个PSP 启用并执行相应的路径选择策略。支持的路径选项有以下3种&#xff1a; VMW_PSP_MRU - 最近使用 它将选择在系…

安装Unity详细教程(如何获取免费个人版许可证)

文章目录 下载Unity Hub安装Unity Hub登录获取免费个人版许可证安装Unity编辑器卸载Unity编辑器 下载Unity Hub 首先&#xff0c;我们需要到Unity的官网下载Unity Hub&#xff1a;Unity CN 我们可以在Unity Hub上管理我们的编辑器版本和项目文件。 安装Unity Hub 然后安装Un…

科技智慧,产业链全覆盖:河南恩珅德农业的养殖业务优势

河南恩珅德农业以科技智慧和全产业链覆盖的优势&#xff0c;成功打造了一体化的养殖业务模式&#xff0c;为养殖者提供了全面的支持和优越的管理体验。以下是该企业养殖业务的核心优势&#xff1a; 1. 先进科技智慧 河南恩珅德农业充分利用先进的科技手段&#xff0c;引入智能…

PS 2024全新开挂神器Portraiture v4.1.2升级版,功能强大,一键安装永久使用

关于PS修图插件&#xff0c;相信大家都有安装过使用过&#xff0c;而且还不止安装了一款&#xff0c;比如最为经典的DR5.0人像精修插件&#xff0c;Retouch4me11合1插件&#xff0c;Portraiture磨皮插件&#xff0c;这些都是人像精修插件中的领跑者。 其中 Portraiture 刚刚升…

视频剪辑方法:掌握视频嵌套合并技术,释放无限创意

随着数字媒体的普及&#xff0c;视频剪辑已是创意表达的重要技巧。通过掌握视频嵌套合并技术&#xff0c;可以将多个视频片段融合在一起&#xff0c;创造出独特的视觉效果和故事叙述。现在一起看云炫AI智剪批量剪辑视频嵌套合并方法&#xff0c;释放无限创意。 准备视频素材&a…

【Unity】 HTFramework框架(四十七)编辑器日志中使用超链接的技巧

更新日期&#xff1a;2024年1月3日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 日志中使用超链接超链接-网络地址超链接-本地地址超链接-项目资源文件超链接-脚本对象 日志中使用超链接 在编辑器控制台Console中的日志是支持富文本的&…

前端开发个人简历范本(2024最新版-附模板)

前端开发工程师个人简历范本> 年龄 25岁 性别 男 毕业院校 XX大学 张三 学历 邮箱 leeywai-tools.cn 本科 专业 计算机科学与技术 个人梗概 拥有扎实的前端开发技能和丰富的实践经验 善于与团队合作&#xff0c;适应能力强&#xff0c;能够快速融入团队并贡献自…

工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)

工业相机如何实现实时和本地Raw图像和Bitmap图像的保存和相互转换&#xff08;C#代码&#xff0c;UI界面版&#xff09; 工业相机图像格式工业相机实现Raw图像和Bitmap图像的保存和转换的技术背景在相机SDK中获取图像转换图像的代码分析工业相机回调函数里保存Bitmap图像数据工…