谁会拒绝一篇关于【python装饰器】的友情分享呢~

news2024/11/18 15:23:56

一、什么是装饰器

1. python装饰器是用于拓展原来函数功能的一种函数,目的是在不改变原函数的情况下,给函数增加功能。

2. 装饰器是通过闭包实现,所以讲装饰器首先得知道什么是闭包。

二、什么是闭包

1、什么是闭包

1. 一个定义在函数内部的函数,闭包可以让变量脱离了该函数的作用域也依然能被访问到
2. 定义一个嵌套函数,内函数内部使用外函数变量,让外函数将内函数当做参数返回,这样就组成了一个闭包

2、举个例子

def outer(x):
    def inner():
        y = x * 2
        return y
    return inner
result=outer(10)
print(result())

如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386   

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1.【接口自动化】目前软件测试的市场行情以及测试人员能力标准。、2.【接口自动化】全面熟练Requests库以及底层方法调用逻辑、3.【接口自动化】接口自动化实战及正则和JsonPath提取器的应用等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click 

3、执行过程分析

1. 调用外函数(outer),将参数赋值给x,此时x=10
2. 执行外函数(outer),内函数(inner)不会被执行
3. 执行到return语句此时返回内函数inner对象(不会被调用)
4. 此时外函数(outer)执行结束的时候发现内部函数会用到自己的临时变量
5. 此时外函数(outer)临时变量就不会释放,会绑定给内函数内函数(inner)继续使用
6. 此时result得到的结果就是inner引用(对象),调用result就等于执行内函数(inner)

三、函数装饰器

1、原理

1. 闭包的特性
2. 函数可以被当做参数传递

2、举个例子


import time
def outer(fn):
    def inner(x,y):
        start_time = time.time()
        result = fn(x,y)
        end_time = time.time()
        return result,end_time - start_time
    print('第一次',inner)
    return inner
  
@outer
def test01(x,y):
    time.sleep(5)
    return x+y
print('第二次',test01)
result=test01(1,2)
print(result)

3、执行过程分析

第一步:执行到@outer相当于把函数 test01 赋值给 outer函数的fn参数

第二步:执行outer函数,返回inner函数

1、outer函数内部嵌套了一个inner函数,利用闭包的原理inner函数可以直接使用outer函数fn的参数
2、在执行outer函数的时候,inner函数并未被执行,是直接返回inner函数给test01函数

3、此时的test01函数已经被outer增加功能后返回的inner函数替换掉了(第一次,第二次打印结果就是证据)

第三步:执行test01(1,2),此时相当于执行inner(1,2)函数参数直接传递给inner函数的x,y

内存地址变化
1. outer内存地址:`<function outer at 0x102e051e0>`
2. test01内存地址:`<function test01 at 0x103739158>`
3. inner内存地址:`<function outer.<locals>.inner at 0x103739268>`
4. test01内存地址:`<function outer.<locals>.inner at 0x103739268>`

四、类装饰器

1、原理

1. 通过重写call方法实现

2、写法


import time
class Decrator:
    def __init__(self,fn):
        self.fn = fn

    def __call__(self, *args, **kwargs):
        start_time = time.time()
        result = self.fn(*args, **kwargs)
        end_time = time.time()
        west_time = end_time - start_time
        return result,west_time

@Decrator
def sum(x,y):
    print(sum)
    return x+y
sum(1,2)

3、执行过程分析

1. __call__()方法的作用其实是把一个类的实例化对象变成了可调用对象,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。

2. 当调用sum函数的时候,会先将sum函数作为参数传给Decrator类(通过类的`__init__`初始化函数接收),此时 fn =sum(x,y)(只是实例未调用)

3. 此时sum函数传递进来的参数为元组,就会赋值给了`__call__`方法,args

4. 此时sum函数传递进来的参数为字典,就赋值给了`__call__`方法,kwargs

5. 在`__call__`方法中做一系列操作之后,return self.fn(*args) 再传递给sum函数 *

6. *` __call__`方法返回的函数self.fn(*args是被装饰后的函数实例,然后传给sum函数执行 

7. `__call__`必须要return装饰后的函数,否则会报错

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

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

相关文章

【Jmeter】配置不同业务请求比例,应对综合场景压测

目录 背景 Jmeter实现&#xff08;Random&#xff09; 在测试计划下&#xff0c;我们右键“添加”——配置原件——Random Variable 设置随机数的变量名称为num&#xff0c;设置取值范围0到100 右键线程组添加“逻辑控制器”——如果&#xff08;if&#xff09;控制器 当…

Win11系统优化

当你看到这篇文章&#xff0c;我相信你电脑卡的已经不行不行的了&#xff0c;执行完快抢救一下。 一、设置win11系统显示效果&#xff08;减轻系统运行压力&#xff09; &#xff08;1&#xff09;.点击桌面的&#x1f50d;按钮&#xff0c;然后在输入框内输入“查看高级系统设…

卷积相关点

从传统的神经网络到卷积神经网络 一.传统的神经网络&#xff08;全连接网络&#xff09; 参数太多&#xff0c;冗余度高&#xff0c;容易过拟合&#xff0c;难以训练 二.卷积神经网络 1.空间平移的不变性&#xff1a;当输入的图像在空间上发生平移时&#xff0c;CNN的相应不…

f12 CSS网页调试_css样式被划了黑线怎么办

我的问题是这样的 class加上去了,但是样式不生效,此时可能是样式被其他样式覆盖了, 解决方案就是 给颜色后边添加一个!important

Java—抽象类

目录 1.抽象类概念 2.抽象类语法 3.抽象类特性 4.抽象类作用 1.抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果 一个类中没有包含足够的信息来描绘一个具体的…

10年测试经验分享 —— 新手如何去做性能测试?

大家好我是彭于晏&#xff1a;一名北漂10年的测试&#xff0c;今天给大家带来关于性能测试的一些个人经验和测试新手如何快速上手性能测试。 1、性能测试是什么&#xff1f; 一句话概括&#xff1a;不断的通过不同场景的系统表现去探究系统设计与资源消耗之间的平衡。 具体一…

uC-OS2 V2.93 STM32L476 移植:系统启动篇

前言 前两篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程&#xff0c;下载了 uC-OS2 V2.93 的源码&#xff0c;并把 uC-OS2 的源文件加入 Keil MDK5 工程 本篇适配 uC-OS2 的 系统定时器&#xff08;Systick&#xff09;与 PendSV_Handler&#xf…

jwt+shiro认证

文章目录 jwt shiro 认证jwt 使用引入依赖编写 jwt 工具类测试 shiro jwt 认证项目文件路径&#xff1a;引入依赖shiro.ini重写 Realm认证服务接口认证服务接口实现类自定义 token测试 代码来自于小傅哥 《API网关》 项目 jwt shiro 认证 jwt 使用 引入依赖 <dependen…

一个SpringBoot 项目能处理多少请求?

这篇文章带大家盘一个读者遇到的面试题哈。 根据读者转述&#xff0c;面试官的原问题就是&#xff1a;一个 SpringBoot 项目能同时处理多少请求&#xff1f; 不知道你听到这个问题之后的第一反应是什么。 我大概知道他要问的是哪个方向&#xff0c;但是对于这种只有一句话的…

【C语言督学训练营 第二十一天】汇编语言零基础入门

文章目录 前言1.C语言源文件转汇编2.汇编指令格式3.汇编常用指令3.1 相关寄存器3.2 常用指令3.3 数据传送指令3.4 算术/逻辑运算指令3.5 控制流指令3.6 条件码 4.如何定义汇编中的变量5.选择循环汇编实战6.函数调用汇编实战7.C语言源文件转机器指令 前言 汇编语言是一种功能很强…

WebDAV之π-Disk派盘 + CX文件管理器

CX文件管理器是一款好用的文件管理工具。它的功能非常的丰富,它能满足用户对文件管理的需求,而且功能也是一目了然,可以帮助用户快速的对文件进行操作。这款软件还支持SFTP、WebDAV、FTP等下载访问方式。手机和电脑在同一局域网下,可以使用FTP或派盘从你的电脑直接访问手机…

selenium页面切换操作

selenuim页面切换 webdriver只能在一个页面里对元素进行识别和定位。如果有多个页面操作的时候&#xff0c;要先进行页面切换。 切换分两种 1 iframe内嵌页面切换&#xff08;框架集切换&#xff09; # 1 获取iframe标签 iframe driver.find_element_by_tag_name(iframe) …

echarts绘制甘特图

说在前面 项目上有需求&#xff0c;需要在大屏上展示进度甘特图&#xff0c;调研了DHTMLX和普加甘特图&#xff0c;效果都不是特别符合需求现状&#xff0c;查询了一些博客&#xff0c;决定使用echarts来绘制甘特图。 实现效果展示 实现思路分析 1、应该采用柱状图&#xff…

LeetCode404. 左叶子之和

404. 左叶子之和 文章目录 [404. 左叶子之和](https://leetcode.cn/problems/sum-of-left-leaves/)一、题目二、题解方法一&#xff1a;递归方法二&#xff1a;迭代 一、题目 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9…

个人信息保护合规审计如何做?

8月3日&#xff0c;为指导、规范个人信息保护合规审计活动&#xff0c;根据《中华人民共和国个人信息保护法》等法律法规&#xff0c;国家互联网信息办公室就《个人信息保护合规审计管理办法&#xff08;征求意见稿&#xff09;》&#xff08;简称《办法》&#xff09;及配套的…

【Apifox】Apifox设置全局Token:

文章目录 一、获取登录Token和设置全局变量&#xff1a;二、设置全局参数&#xff1a;三、效果&#xff1a; 一、获取登录Token和设置全局变量&#xff1a; 二、设置全局参数&#xff1a; 三、效果&#xff1a;

盘点7月Sui生态发展,了解Sui的近期成长历程!

自5月Sui主网上线三个月以来&#xff0c;7月是Sui网络进行最多次重要更新的一个月&#xff0c;Sui网络和生态正呈指数形式不断向上发展。为吸引更多的项目或开发者加入生态构建以及活跃用户参与生态&#xff0c;Sui基金会推出了Builder House、黑客松、Bullshark Quests、NFT再…

数据库:MYSQL参数max_allowed_packet 介绍

1、参数作用 max_allowed_packet参数是指mysql服务器端和客户端在一次传送数据包的过程当中最大允许的数据包大小。如果超过了设置的最大长度,则会数据库保持数据失败。 2、问题场景 ● 有时候业务的需要,可能会存在某些字段数据长度非常大(比如富文本编辑器里面的内容),…

基于Java的学生管理系统设计与实现

一、系统功能介绍 基于Java的学生管理系统&#xff0c;本系统包括学生信息管理、学生成绩管理、县教育信息管理、个人资料管理等功能。 二、相关页面展示 以下是页面展示&#xff1a; 1 登录页面 2 首页页面页面 3 学生成绩查询页面 4 本校成绩排行页面 5 管理员学生成绩管…

【Apollo学习笔记】—— Cyber RT之调度

文章目录 前言相关代码整理 调度介绍Cyber RT的改进实时操作系统资源限制&优先级协程 Cyber RT调度策略任务窃取两种任务类型componen组件自定义任务 Cyber调度实践配置文件DAG文件cyber_launch文件component组件BUILD文件 问题参考 前言 本文是对Cyber RT的学习记录,文章可…