Python 装饰器

一、装饰器

    就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数​。类似于Spring的切面

二、应用场景

  1. 收集函数错误日志信息
  2. 验证函数使用权限
  3. 计算函数运行时间
  4. 定制函数的输入和输出(序列化和反序列化)

三、装饰器的特点: 

  1. 不修改已有函数的源代码
  2. 不修改已有函数的调用方式
  3. 给已有函数增加额外的功能

四、 装饰器

(1)装饰器来装饰函数

def check(fn):
    def inner():
        print('请先检查网络')
        fn() #调用函数login
    return inner #返回的内部函数引用

#1.使用装饰器来装饰函数
def login():
    print('开始登陆啦!')

#2.ch是内部函数的引用
ch=check(login)
ch() #3.调用内部函数

2)语法糖格式: @装饰器名字,通过语法糖的方式也可以完成对已有函数的装饰

import time 

#2>语法糖 @函数名
# @check 等同于 ch=check(login)
@check
def register():
    print('准备注册了!')

print('@'*50)
# 直接调用
register()

time.sleep(2) #间隔2秒
register()

 

 函数执行时间统计应用:

def outer1(func):
    def inner():
        start=time.time()
        print(f'装饰器开始时间:{start}s')
        func()  #调用add()函数
        end=time.time()
        print(f'装饰器结束时间:{end}s')
        print(f'函数执行完成耗时:{end-start}秒')
    return inner  #返回内部函数的引用


@outer1
def add_data():
    ll=[]
    #1000万数据添加到列表中
    for i in range(10000000):
        ll.append(i)

#直接调用
add_data()

 

五、 通用装饰器的使用 

可以装饰任意类型的函数

 ​使用装饰器装饰已有函数的时候,内部函数的类型和要装饰的已有函数的类型保持一致

1 、装饰带有不定长的参数,并返回值的函数

def outer2(func):
    def inner(*args,**kwargs):
        return '带有 ' + func(*args,**kwargs) + ' 装饰器'
    return inner


#一个参数
@outer2
def show2_1(a):
    return f'【传一个参数:{a}】'

print(show2_1(9999))


#两个参数
@outer2
def show2_2(a,b):
    return f'【传两个参数:{a,b}】'

print(show2_2("you","I"))

#多个参数
@outer2
def show2_3(*args,**kwargs):
    return f'【fine,\t列表数据:{args}\t键值数据:{kwargs}】'


print(show2_3(100,88,name='mike',age=18))

 六、多个装饰器的使用

多个装饰器的装饰过程是: 离函数最近的装饰器先装饰,然后外面的装饰器再进行装饰,由内到外的装饰过程
# 多个装饰器
def outer1(func):
    """对被装饰的函数的返回值"""
    def inner(*args,**kwargs):
        return '第一个 '+func()+' 装饰器'   #注意必须是函数哦!
    return  inner


def outer2(func):
    def inner(*args,**kwargs):
        return '第二个 ' + func(*args,**kwargs) + ' 装饰器'
    return inner



@outer1
@outer2
def show3():
    return 'okay'

# 离函数最近的装饰器先装饰,然后外面的装饰器再进行装饰,由内到外的装饰过程
print(show3())

 原理剖析:content = outer1(outer2(content))
 分布拆解:content = outer2(content),内部装饰器完成,content = outer2.inner
          content = outer1(outer2.inner)

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于DDS的SOA测试方案实现

随着以太网技术在车载网络中的应用,各种基于以太网的中间件也相继被应用在车内,如果对车载网络有过相关了解的小伙伴,对于作为中间件之一的DDS(数据分发服务Data Distribution Service)可能并不陌生;若没有…

mmdetection3d可视化多模态模型推理结果

本篇博文讲一下mmdetection3d可视化 参考文献: 带你玩转 3D 检测和分割 (三):有趣的可视化 - 知乎 (zhihu.com) Welcome to MMDetection3D’s documentation! — MMDetection3D 1.0.0rc4 文档 1、介绍 让我们看一下ChatGPT的回答[手动狗头]:…

瑞萨G2UL工业核心板内存测试,您想了解的内容全都有

1. 测试对象 HD-G2UL-EVM基于HD-G2UL-CORE工业级核心板设计,一路千兆网口、一路CAN-bus、3路TTL UART、LCD、WiFi、CSI 摄像头接口等,接口丰富,适用于工业现场应用需求,亦方便用户评估核心板及CPU的性能。 HD-G2UL-CORE系列工业级…

Linux介绍

目录 如何有一个Linux环境 使用终端工具登录 常见Linux命令 ls 查看指定目录中的内容 pwd 查看目录当前完成的绝对路径 cd 切换目录 touch 创建空的文件 cat 查看文件内容 echo 写文件 vim mkdir 创建目录 rm 删除文件/目录 mv 移动文件或目录 cp grep 字符串查找…

WebKitX ActiveX 6.0 X86 Crack

WebKitX ActiveX将 Chromium Embedded Framework (CEF3) 包装到一个进程外的 ActiveX 组件中,以便与 OLE/COM 语言一起使用。Chromium Embedded Framework 封装了 WebKit Blink HTML5 Renderer 和 Google V8 JavaScript Engine。这是一个用于商业用途的生产级稳定组…

Nginx学习(11)—— Nginx源码架构、configure是怎么执行的(编译的具体细节)

文章目录Nginx的源码目录结构Nginx中configure的原理auto脚本模块编译顺序Nginx的源码目录结构 nginx的源码目录与nginx的模块化以及功能的划分是紧密结合,这也使得我们可以很方便地找到相关功能的代码。我们先来看一下nginx源码的目录结构。 使用tree命令看一下&…

大学计划|关于举办《数字化转型赋能教育创新发展高峰论坛》的通知

随着科技革命和产业变革的深入发展,数字化赋能经济社会发展的作用日益凸显,也影响着教育生态的发展变革。目前,社会对复合型人才的需求量不断提高,培养符合社会发展需要的创新型人才也成为高等院校教育数字化转型的重点目标之一。…

第二个项目 基于React技术学习的pc端项目

介绍: 1.本项目使用umi脚手架搭建项目,并将umi升级到3.5.0版本,采用模块化、组件化、工程化模块开发方式; umi脚手架开发有什么好处 为什么要用umi进行项目开发? 2.用react-router-dom实现前端路由部署,使…

Node-包管理工具整套下载使用讲解(nvm、npm、yarn、cnpm、pnpm、nrm)

前言 包管理工具npm: Node Package Manager,就是Node包管理器现在已经不仅仅是node的包管理器了,我们前端项目也都会用它来进行管理项目依赖的包 如何下载和安装npm工具 npm属于node的一个管理工具,所以我们需要先安装Node&#x…

嵌入式软件架构

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录1 嵌入式软件分类 – BAREMETAL2 嵌入式软件分类 – 实时操作系统 (RTOS)3 嵌入式软件分类 – “通用”操作系统4 嵌入式软件分类 – 容器/微服务微服务容器5 嵌…

python 绘制训练曲线--Savitzky-Golay 滤波平滑处理

文章目录1 训练曲线--震荡的非常厉害2 Savitzky-Golay 滤波器--平滑曲线3 python 绘制训练曲线--插值法 曲线平滑处理4 python 绘制训练曲线--基于Numpy.convolve曲线平均滤波5 用python自己绘制训练曲线1 训练曲线–震荡的非常厉害 上一篇文章用python自己绘制训练曲线震荡的…

FFmpeg编程入门

音视频术语 容器/文件(Conainer/File):即特定格式的多媒体文件,比如mp4、flv、mkv等。媒体流(Stream):表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段…

强化学习之入门笔记(二)

文章目录强化学习一、Qlearning算法QlearningTD之于Q值估算麻烦来了SARSAQlearning二、深度强化学习三、DQNDeep network Qlearning DQN神经网络的目标四、Policy Gradient策略梯度(Policy Gradient)直观感受PG算法五、Actor-Critic什么是ACTD-error参考强化学习 一、Qlearn…

零售数据分析之操作篇8:用历史聚合巧算库存

各位数据的朋友,大家好,我是老周道数据,和你一起,用常人思维数据分析,通过数据讲故事。 上期内容回顾与作业讲解 上一讲讲了鞋服零售企业非常关注的一个指标售罄率的概念与实现方法,这里我们用到了历史聚…

【最小生成树】一文学懂prim、kruskal算法

博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: 算法 ;该专栏专注于蓝桥杯和ACM等算法竞赛🔥近期目标&…

【教程】使用ChatGPT制作基于Tkinter的桌面时钟

目录 描述 代码 效果 说明 下载 描述 给ChatGPT的描述内容: python在桌面上显示动态的文字,不要显示窗口边框。窗口背景和标签背景都是透明的,但标签内的文字是有颜色。使用tkinter库实现,并以class的形式书写,方…

刷算法题

文章目录1.模拟1.switch case 与 if else 的区别2.格式化输入输出: scanf("%4d") 只读取4个长度的int2.排序1.sort(arr,arrn,comp)2.set3.查找1.结构体数组4.字符串1.string和int的相互转换2.map[key]3.getline()getline(cin,str)一行字符串后&#xff0c…

cocosCreator 事件系统

概述: DOM的输入事件通过CCInputManager转化成cocos的输入事件,由CCEventManager 分发给监听器。 监听器在通过回调函数(begin/move/end/cancel)告知事件派发对象(eventTarget)派发事件。 重要类: event&#xff1…

WebGL着色器 GLSL入门

我们已经讨论了着色器和 GLSL,但还没有真正给它们任何具体细节。 我想我希望通过示例可以清楚地说明这一点,但为了以防万一,让我们尝试使其更清楚。 正如其工作原理中所述,WebGL 每次绘制内容时都需要 2 个着色器。 顶点着色器和…

ContextCapture Master 倾斜摄影测量实景三维建模技术应用

ContextCapture实景建模大师是一套无需人工干预,通过影像自动生成高分辨率的三维模型的软件解决方案。它集合了全球最先进数字影像处理、计算机虚拟现实以及计算机几何图形算法,在易用性、数据兼容性、运算性能、友好的人机交互及自由的硬件配置兼容性等…
最新文章