装饰器(Decorator)本质上是一个返回函数的函数
主要作用是:在不修改原函数代码的前提下,给函数增加额外的功能
比如:增加业务,日志记录、权限验证、执行时间统计、缓存等场景

@my_decorator
def func():pass# 等价于:
def func():pass
func = my_decorator(func)

1、闭包

def outer(x):def inner(y):return x + yreturn inneradd5 = outer(5)
print(add5(3))  # 输出 8

闭包(Closure)指一个函数定义在另一个函数内部,并且这个内部函数引用了外部函数的变量。即使外部函数已经返回了,内部函数依然**“记住”**并可以访问这些变量
就如这里的x

功能
  • 保存函数执行时的“上下文”;

  • 用于延迟计算或构造回调函数;

  • 实现数据隐藏(类似于面向对象中的私有变量);

  • 替代某些简单场景中的类。

2、装饰器基础

装饰器本质上就是闭包的一种应用,用于在不修改函数源代码的情况下增强函数功能


def decorator(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)stop_time = time.time()print(f'running_time is {stop_time - start_time}')return resultreturn wrapper@decorator   # double=decorator(double)
def double(x):time.sleep(1) # 模拟耗时return x*2
double(10)

这里在原本的基础上增加了(统计函数执行时间)功能

3、保留函数元数据

使用装饰器后
装饰器会覆盖原函数的元数据
在这里插入图片描述
使用functools.wraps装饰内层函数可保留原函数元数据

import functools
import time# 装饰器outer
def decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):'''这里是wrapper的注释'''start_time = time.time()result = func(*args, **kwargs)stop_time = time.time()print(f'running_time is {stop_time - start_time}')return resultreturn wrapper
@decorator   # double=decorator(double)
def double(x):'''这里是doubled的注释'''time.sleep(1) # 模拟耗时return x*2
double(10)
print(double.__name__)
print(double.__doc__)

在这里插入图片描述

4、带参数的装饰器

需要使用三层函数来实现。最外层函数接收装饰器参数,中间层函数接收原函数,最内层函数完成对原函数的调用以及附加功能。

def timer(time_consume):def decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)stop_time = time.time()if (stop_time - start_time>time_consume):print(f'running is {stop_time - start_time}')print(f'{func.__name__} is longer')return resultreturn wrapperreturn decorator
@timer(0.8)   # double=timer(0.8)(double)
def double(x):time.sleep(1) # 模拟耗时return x*2
double(10)

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

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

相关文章

AI教你学VUE——Gemini版

前端开发学习路线图 (针对编程新手,主攻 Vue 框架) 总原则:先夯实基础,再深入框架。 想象一下建房子,地基不牢,上面的高楼(框架)是盖不起来的。HTML、CSS、JavaScript 就是前端的地基。 阶段一…

神经网络中之多类别分类:从基础到高级应用

神经网络中之多类别分类:从基础到高级应用 摘要 在机器学习领域,多类别分类是解决复杂问题的关键技术之一。本文深入探讨了神经网络在多类别分类中的应用,从基础的二元分类扩展到一对多和一对一分类方法。我们详细介绍了 softmax 函数的原理…

Go Web 后台管理系统项目详解

Go Web 后台管理系统项目详解 一、背景介绍 这是一个基于 Go 语言开发的 Web 后台管理系统,为笔者学习期间练手之作,较为粗糙 二、技术架构 后端 语言 :采用 Go 语言(Golang)编写,因其简洁高效、并发能…

【Python系列】Python 中的 HTTP 请求处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

OS7.【Linux】基本指令入门(6)

目录 1.zip和unzip 配置指令 使用 两个名词:打包和压缩 打包 压缩 Linux下的操作演示 压缩和解压缩文件 压缩和解压缩目录 -d选项 2.tar Linux下的打包和压缩方案简介 czf选项 xzf选项 -C选项 tzf选项 3.bc 4.uname 不带选项的uname -a选项 -r选项 -v选项…

windows系统 压力测试技术

一、CPU压测模拟 工具:CpuStres v2.0 官网:https://learn.microsoft.com/en-us/sysinternals/downloads/cpustres 功能:是一个工具类,用来模拟在一个进程中启动最多64个线程,且可以独立控制任何一个线程的启动/暂停、…

64.搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。 示…

在 PyTorch 中借助 GloVe 词嵌入完成情感分析

一. Glove 词嵌入原理 GloVe是一种学习词嵌入的方法,它希望拟合给定上下文单词i时单词j出现的次数。使用的误差函数为: 其中N是词汇表大小,是线性层参数, 是词嵌入。f(x)是权重项,用于平衡不同频率的单词对误差的影响…

kotlin中 热流 vs 冷流 的本质区别

🔥 冷流(Cold Flow) vs 热流(Hot Flow)区别 特性冷流(Cold Flow)热流(Hot Flow)数据生产时机每次 collect 才开始执行启动时就开始生产、始终运行生命周期与 collect 者…

精益数据分析(44/126):深度解析媒体网站商业模式的关键要点

精益数据分析(44/126):深度解析媒体网站商业模式的关键要点 在创业与数据分析的探索道路上,我们不断挖掘不同商业模式的核心要素,今天将深入剖析媒体网站商业模式。希望通过对《精益数据分析》相关内容的解读&#xf…

Android学习总结之Java和kotlin区别

一、空安全机制 真题 1:Kotlin 如何解决 Java 的 NullPointerException?对比两者在空安全上的设计差异 解析: 核心考点:Kotlin 可空类型系统(?)、安全操作符(?./?:)、非空断言&…

[Survey]Remote Sensing Temporal Vision-Language Models: A Comprehensive Survey

BaseInfo TitleRemote Sensing Temporal Vision-Language Models: A Comprehensive SurveyAdresshttps://arxiv.org/abs/2412.02573Journal/Time2024 arxivAuthor北航 上海AI LabCodehttps://github.com/Chen-Yang-Liu/Awesome-RS-Temporal-VLM 1. Introduction 传统遥感局限…

jmeter读取CSV文件中文乱码的解决方案

原因分析​ CSV文件出现中文乱码通常是因为文件编码与JMeter读取编码不一致。常见场景: 文件保存为GBK/GB2312编码,但JMeter以UTF-8读取。文件包含BOM头(如Windows记事本保存的UTF-8),但JMeter未正确处理。脚本读取文…

Webview通信系统学习指南

Webview通信系统学习指南 一、定义与核心概念 1. 什么是Webview? 定义:Webview是移动端(Android/iOS)内置的轻量级浏览器组件,用于在原生应用中嵌入网页内容。作用:实现H5页面与原生应用的深度交互&…

【C++】C++中的命名/名字/名称空间 namespace

C中的命名/名字/名称空间 namespace 1、问题引入2、概念3、作用4、格式5、使用命名空间中的成员5.1 using编译指令( 引进整个命名空间) ---将这个盒子全部打开5.2 using声明使特定的标识符可用(引进命名空间的某个成员) ---将这个盒子中某个成员的位置打…

Arduino IDE中离线更新esp32 3.2.0版本的办法

在Arduino IDE中更新esp32-3.2.0版本是个不可能的任务,下载文件速度极慢。网上提供了离线的办法,提供了安装文件,但是没有3.2.0的版本。 下面提供了一种离线安装方法 一、腾讯元宝查询解决办法 通过打开开发板管理地址:通过在腾…

【工具使用-数据可视化工具】Apache Superset

1. 工具介绍 1.1. 简介 一个轻量级、高性能的数据可视化工具 官网:https://superset.apache.org/GitHub链接:https://github.com/apache/superset官方文档:https://superset.apache.ac.cn/docs/intro/ 1.2. 核心功能 丰富的可视化库&…

算法每日一题 | 入门-顺序结构-三角形面积

三角形面积 题目描述 一个三角形的三边长分别是 a、b、c,那么它的面积为 p ( p − a ) ( p − b ) ( p − c ) \sqrt{p(p-a)(p-b)(p-c)} p(p−a)(p−b)(p−c) ​,其中 p 1 2 ( a b c ) p\frac{1}{2}(abc) p21​(abc) 。输入这三个数字,…

MongoDB入门详解

文章目录 MongoDB下载和安装1.MongoDBCompass字段简介1.1 Aggregations(聚合)1.2 Schema(模式分析)1.3 Indexes(索引)1.4 Validation(数据验证) 2.增删改查操作2.1创建、删除数据库&…

从Oculus到Meta:Facebook实现元宇宙的硬件策略

Oculus的起步 Facebook在2014年收购了Oculus,这标志着其在虚拟现实(VR)领域的首次重大投资。Oculus Rift作为公司的旗舰产品,是一款高端的VR头戴设备,它为用户带来了沉浸式的体验。Facebook通过Oculus Rift&#xff0…