装饰器Python】进阶知识点

news2024/11/27 2:46:21

要明白装饰器首先得知道闭包 

闭包:是内部函数对外部函数作用域的引用,并且一般外部函数函数的返回值是内部函数的函数名

               def outer(x):    # 外部函数
                      a = x * 2
                         def inter(b)  # 内部函数
                              return a + b   # inter 函数内部使用了outer函数内部的变量
                    return inter
              outer(1,2)

-装饰器:  @
      - 装饰器又叫语法糖,装饰器是一个闭包函数,装饰器的作用不会修改原有函数的功能,在原有的基础上添加自己的新的功能。 

def outer(func):    #3、  #  接受的这个参数 func  ==  operated函数名
    def inter():   # 5、
        b = 2      #6、
        result = func(b)   # 6、  # func(b)  == operated(b)
        return result    # 9、    # return operated(b)   ==  operated(b)函数的调用
    return inter    # 4、
    # return inter  # 返回函数名或者函数对象
    # return inter() # 返回函数调用


@outer   # 2、装饰器
def operated(b):  # 7、
    c = 1         # 8、
    a = b + c     # 8、
    print(a)      #8、
operated()  # 1、

执行流程 : 1、如果你用到了装饰器 ,装饰器会把被装饰的函数名当作参数接受上来,并且再执行调用一次
        如果你调用 operated()  --> 首先会执行  @outer ,  @outer == outer(operated)()
     2、执行完outer(operated)返回了一个outer() 函数的内部函数名 ,inter,执行完outer(operated)() 是不是返回了inter(),效果是调用了内部函数inter()
     3、当执行 inter()[这是一个函数调用] 会执行inter()函数中的内容
                              b = 2
                              result = func(b)    #
      当执行到  result = func(b) 时,又是一个函数调用 ,调用了func(b),我们知道func 是被装饰函数传递过来的参数,operated
      func(b) == operated(b) 回调了,被装饰函数operated(),并且传入了参数b,并且将调用的结果

返回赋值给了resullt变量,
      最后一步返回变量 resullt 也就是返回了  operated(b) 函数执行的结果
 

 

疑惑点:

 执行   @outer  等于执行    outer(operated)()  ,执行完outer(operated)()  返回了return inter(),明明 operated并没有被传递,为什么inter()函数却可以调用 

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

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

相关文章

手撕数据结构—单链表

✅作者:简单^不简单 🔥系列专栏:C语言数据结构 💖如果文章有错误,时刻欢迎大家的指正。当然觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝 💬格言:希望我…

设计模式之-模板方法模式C++实现与C++模板template用法

介绍 模板方法模式使用比较常见,也比较简单,模板方法模式是属于设计模式中的行为设计模式。行为设计模式是关注对象的行为或者交互方面的内容,主要涉及算法和对象之间的职责分配。 模板方法模式使用场景:在设计需求中,…

java并发编程:synchronized关键字与锁详解

文章目录 线程安全问题synchroinzed关键字几种锁Java对象头偏向锁轻量级锁自旋锁重量级锁锁升级的场景 JVM 是如何实现 synchronized 的?小结 这篇文章我们来聊一聊Java多线程里面的“锁”。 首先需要明确的一点是:Java多线程的锁都是基于对象的&#x…

御用飞场之惊险炸鸡寻根溯源

御用飞场之惊险炸鸡寻根溯源 1. 源由2. 分析3. 证据4. 总结5. 补充:BetaFlight Mark4 自锁螺母桨叶松动 炸机瞬间 1. 源由 这个炸鸡的原因千奇百怪,不过最终的结果都是相似的。 如果能很好的找到根原因,相对来说,今后炸鸡的概…

element-ui表格el-table的使用

先给大家展示一下效果 Table 属性 属性名说明类型可选值默认值data显示的数据array——heightTable 的高度, 默认为自动高度。 如果 height 为 number 类型,单位 px;如果 height 为 string 类型,则这个高度会设置为 Table 的 sty…

初阶指针(详解)

目录 前言 一 指针是什么 计算机又是如何编址的? 总结 二 指针和指针类型 指针-整数 总结: 指针的解引用 总结 三 野指针 概念 野指针的成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间被释放 如何规避野指针 四 指针运算…

iMazing2.16.9中文最新版iOS设备管理器下载教程

iMazing2.16.9是一款兼容Win和Mac的iOS设备管理软件。iMazing能够将音乐、文件、消息和应用等数据从任何 iPhone、iPad 或 iPod 传输到 Mac 或 PC 上。iMazing轻松管理和备份您的 iOS 设备,无需使用 iTunes,iMazing以自己的方式管理 iPhone。让备受信赖的软件为您传…

遗传算法(附简单案例及matlab详细代码)

作者:非妃是公主 专栏:《智能优化算法》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录 专栏推荐序一、生物进化二、遗传算法原…

华为OD机试真题 Java 实现【按身高和体重排队】【2022Q4 100分】,附详细解题思路

一、题目描述 某学校举行运动会,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列; 对于身高体重都相同的人,维持原有的编号顺序关系。请输出排列后的学生…

全闪SDS三节点EC(4+2:1)性能挑战测试

前段时间咱们存储圈在讨论一下全闪SDS性能挑战: 三节点集群,用EC(42:1),性能目标是:4KB随机读写7:3,达到100万IOPS,平均时延0.5ms,P99时延1ms。硬件配置:网络…

菜鸟的刷题之路之二叉树

💕“成功不是终点,失败不是终结,勇气才是启程的第一步。”💕 🐼作者:不能再留遗憾了🐼 🎆专栏:菜鸟的刷题之路🎆 🚗本文章主要内容:将…

GORM---创建

目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义 定义一个PersonInfo结构体。 type PersonInfo struct {Id uint64 gorm:"column:id;primary_key;NOT NULL" json:"id"UserName string gorm:"co…

路径规划算法:基于狮群优化的路径规划算法- 附代码

路径规划算法:基于狮群优化的路径规划算法- 附代码 文章目录 路径规划算法:基于狮群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法狮群…

Prometheus+Grafana(外)监控Kubernetes(K8s)集群(基于containerd)

一、实验环境 1、k8s环境 版本v1.26.5 二进制安装Kubernetes(K8s)集群(基于containerd)—从零安装教程(带证书) 主机名IP系统版本安装服务master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxymaster021…

在 Ubuntu 20.04 上安装 Nginx

保证以 sudo 用户身份登录,并且你不能运行 Apache 或者 其他处理进程在80端口和443端口。 安装 Nginx Nginx 在默认的 Ubuntu 源仓库中可用。想要安装它,运行下面的命令: sudo apt update sudo apt install nginx 一旦安装完成&#xff0…

Redis高级数据结构之Bitmaps

Bitmaps的介绍 现代计算机使用二进制位作为信息存储的基本单元。一个字节(Byte)等于8个二进制位(bit)。合理的使用位能有效提高内存使用率和开发效率。位是最小信息单位,可以表示两个状态之一。字节是更大的单位&…

虚拟机搭建

Linux(CentOS-7.6-x64位)基础配置, 虚拟机平台VmWare15 CentOS-7.6-x64镜像下载: https://www.aliyundrive.com/s/72Xg449t6i8 提取码: 32rm VmVare15安装包下载带序列号:VmVare15安装包下载带激活序列号资源-CSDN文库 点击关闭,点击完成&…

深入理解Jar文件:创建、使用和多版本控制

🧑‍💻CSDN主页:夏志121的主页 📋专栏地址:Java基础进阶核心技术专栏 目录 🍛 一、创建JAR文件 🍜 二、安装和使用清单文件 🍝 三、创建可执行的JAR文件 🍠 四、多版…

微信小程序开发实战 ②②(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage 📜: 微信小程序 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &#x1f4…

网络安全大厂面试题合集+

以下为网络安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,祝各位都能找到满意的工作。 注:本套面试题,已整理成pdf文档,但内容还在持续更新中,因为无论如何都不可能覆盖所有的面试问题&#xf…