Python 中,装饰器和闭包的解释

在 Python 中,装饰器和闭包是两个非常重要且强大的概念,下面为你详细介绍它们。

闭包(Closure)

定义

闭包是指有权访问另一个函数作用域中变量的函数。简单来说,当一个内部函数引用了外部函数的变量,并且外部函数返回了这个内部函数时,就形成了一个闭包。

示例代码

def outer_function(x):def inner_function(y):return x + yreturn inner_function# 创建闭包实例
closure = outer_function(10)# 调用闭包
result = closure(5)
print(result)  # 输出: 15

代码解释

  • outer_function 是一个外部函数,它接受一个参数 x
  • inner_function 是一个内部函数,它接受一个参数 y,并且在函数体中引用了外部函数的变量 x
  • outer_function 返回了 inner_function,此时 inner_function 就形成了一个闭包,它记住了外部函数的变量 x 的值。
  • 当调用 outer_function(10) 时,返回了一个闭包实例 closure,此时闭包内部记住了 x 的值为 10。
  • 调用 closure(5) 时,实际上是调用了 inner_function(5),并将 x 的值 10 和 y 的值 5 相加,最终返回 15。

闭包的作用

  • 数据隐藏和封装:闭包可以访问外部函数的局部变量,这些变量对外是隐藏的,只能通过闭包来访问和修改,从而实现数据的隐藏和封装。
  • 实现函数工厂:闭包可以根据不同的参数生成不同的函数,就像一个函数工厂一样。

装饰器(Decorator)

定义

装饰器是一种特殊的函数,它可以接受一个函数作为参数,并返回一个新的函数。装饰器的主要作用是在不修改原函数代码的前提下,为原函数添加额外的功能,比如日志记录、性能测试、权限验证等。

示例代码

# 定义一个装饰器函数
def log_decorator(func):def wrapper(*args, **kwargs):print(f"调用函数 {func.__name__},参数: {args}, {kwargs}")result = func(*args, **kwargs)print(f"{func.__name__} 函数调用结束")return resultreturn wrapper# 使用装饰器
@log_decorator
def add(a, b):return a + b# 调用被装饰的函数
result = add(3, 5)
print(result)

代码解释

  • log_decorator 是一个装饰器函数,它接受一个函数 func 作为参数。
  • wrapper 是一个内部函数,它接受任意数量的位置参数 *args 和关键字参数 **kwargs,并在调用原函数 func 前后添加了日志记录的功能。
  • log_decorator 返回了 wrapper 函数,这样就形成了一个闭包,wrapper 函数可以访问外部函数的 func 变量。
  • @log_decorator 是装饰器的语法糖,它等价于 add = log_decorator(add),即将 add 函数作为参数传递给 log_decorator 函数,并将返回的新函数重新赋值给 add
  • 当调用 add(3, 5) 时,实际上是调用了 wrapper(3, 5),在调用原 add 函数前后会输出日志信息,最后返回原 add 函数的结果。

装饰器的作用

  • 代码复用:可以将一些通用的功能封装在装饰器中,然后应用到多个函数上,避免代码重复。
  • 增强函数功能:在不修改原函数代码的情况下,为原函数添加额外的功能,提高代码的可维护性和可扩展性。

闭包与装饰器的关系

装饰器本质上是基于闭包实现的。在装饰器函数中,内部函数(如上述示例中的 wrapper 函数)引用了外部函数的参数(如 func),并返回这个内部函数,从而形成了一个闭包。通过这个闭包,可以在不修改原函数的情况下,对原函数进行增强。

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

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

相关文章

HTTPS,TLS原理分析

简单介绍 Tansport Layer Security TLS 已经逐渐取代 SSL 可以简单理解:HTTPS = HTTP + SSL/TLS TLS运行在TCP之上,HTTP之下,传输层协议,负责HTTP内容的安全传输 TLS流程在TCP三次握手建立连接后开始 TLS协议结构wireshark中TLS主要分为两层,底层的是TLS记录协议,主要负责…

训练ai生成代码效果展示

训练ai生成代码效果展示 在本次实验中试图使用命令的形式来训练ai,达到成功获取需要的web开发页码的效果 起初 本来我打算让ai生成一个整体的项目,但是ai不可以直接生成一整块的项目,他也没办法把得到的结果以文件的形式传给你,得到的还是文本,第一实验的结果并不理想 以下是训…

公交线路(迪杰斯特拉)

这道题就是一道迪杰斯特拉的板子,没想到的是我想到了重载小于符号,没想到要定义优先队列 #include<iostream> #include<vector> #include<queue> #include<cstring> using namespace std; const int N=1000+5; struct node{int id,dis; }; vector<…

HDFS中数据目录的挂载在根目录下至磁盘爆满问题解决

1、查看hdfs-size.xml文件 获取数据目录位置vim /opt/hadoop/etc/hadoop/hdfs-site.xml<property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop-data/data-node-data,/home/hadoop-data/data-node-data-2,/data-3</value> </pro…

下载及安装

进入官网https://www.docker.com/ 直接在浏览器下载会比较慢,我习惯复制下载链接后到迅雷去下载,更快一些 双击安装后会有个选项是add....什么什么,意思是添加桌面快捷方式 后有个选项是退出并重启,这个重启是重启电脑(所以截图没有了),记得保存好自己的文档 问卷调查 …

修理牛棚

思路: 有的牛棚住牛,有的是空的,从反过来的思路来想,先用一块木板盖住所有有猪住的猪棚,减去空牛棚数,最终得到最多被木板挡住门的牛棚的数量。 代码展示: #include<bits/stdc++.h> using namespace std; const int N=210; int m,s,c;int a[N],b[N];int main() {c…

写了个 CasaOS/ZimaOS 内网穿透的远程访问插件(不是 frp 或者 nps),欢迎大家测试使用

插件正在提交,应该过几天就会进入市场了。 插件访问效果大概如下: casaOS 远程界面 如果大家想先行测试可以手动下载 pr 的文件进行测试。使用 插件会提供一个二维码,使用OpenIoThub 开源 APP扫码添加插件网关,然后在客户端上添加要访问的主机,然后在主机下面添加端口,然…

20241904 2024-2025-2 《网络攻防实践》第一周作业

​ 一、知识点梳理与总结 1、 实验介绍 1) VM操作系统的三种网络连接方式的适用情况 (1)桥接(Bridged)模式 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一…

从cURL到GraphQL:不同API类型概述

从cURL到GraphQL:不同API类型概述 API(应用程序编程接口)是现代软件开发的支柱,能够使不同的应用程序进行通信、共享数据并无缝执行任务。了解各种API类型及其实际应用可以为开发人员提供宝贵的见解。本文将探讨不同的API类型、它们的重要性,并通过实际示例说明它们的应用…

【H2O】--【HybrIK】关于RGB2SMPL算法工程HybrIK的安装记录

1. 前言 主要记录关于RGB2SMPL算法工程HybrIK的安装记录。 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 2.0 torch_tricks model.train()的作用是启用 Batch Normalization 和 Dropout。 m…

粤港澳大湾区-工业软件中心-诚聘CAE测试专家、高性能计算专家、系统工程师、CAE软件架构师、嵌入式软件开发工程师、数据库软件测试工程师等(广州 不限制年龄)

简介 粤港澳大湾区国家技术创新中心工业软件产业发展中心,是粤港澳大湾区国家技术创新中心直属创新平台之一。该中心致力于聚焦工业软件基础创新,构建工业软件全过程创新生态链,为推动我国工业软件产业发展做出重要贡献。 主要目标攻克核心技术: 突破工业软件核心关键技术,…

09 深度神经网络框架的基础:自动微分

当神经网络的层数增加,结构变复杂后,如果只用纯python(再加Numpy)来实现,代码将变得异常复杂,且难以阅读和调试。此时,就需要引入一些著名的深度学习框架了,比如PyTorch, TensorFlow等。 运用这些框架,你往往只需要定义一个神经网络的架构,反向传播过程则是自动完成的…