位置: 编程技术 - 正文

深入理解python中的闭包和装饰器(深入python3)

编辑:rootadmin

推荐整理分享深入理解python中的闭包和装饰器(深入python3),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入python3,python深入浅出,python的理解,如何理解python语言,python深入浅出,python的理解,深入理解python特性 pdf,深入理解python特性 pdf,内容如对您有帮助,希望把文章链接给更多的朋友!

python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

以下说明主要针对 python2.7,其他版本可能存在差异。

也许直接看定义并不太能明白,下面我们先来看一下什么叫做内部函数:

我在函数里面有嵌套了一个函数,当我向外层函数传递一变量的之后,并赋值给 a ,我们发现 a 变成了一个函数对象,而我再次为这个函数对象传参的时候,又获得了内部函数的返回值。我们知道,按照作用域的原则来说,我们在全局作用域是不能访问局部作用域的。但是,这里通过讨巧的方法访问到了内部函数。。

下面我们继续看一个例子:

可以看出函数位于外部函数中的列表 a 竟然改变了。要知道为什么,就要先知道什么是python的命名空间,而命名空间就是作用域表现的原因,这里我简要说明一下。

引入命名空间的主要原因还是为了避免变量冲突,因为python中的模块众多,模块中又有函数,类等,它们都要使用到变量。但如果每次都要注意不和其他变量名冲突,那就太麻烦了,开发人员应该专注于自己的问题,而不是考虑别人写的程序中用到了什么变量,所以python引入了命名空间。命名空间分为模块层,模块内又分为全局作用域和局部作用域,用一个图来表示的话:

模块之间命名空间不同,而里面还有全局作用域和局部作用域,局部作用域之前还能嵌套,这样就能保证变量名不冲突了。这里顺便补充一下,可以通过 __name__ 属性获取命名空间的名字:

主文件的命名空间是叫做 '__main__',而模块的命名空间就是模块名。

作用域的诞生,是因为当python在寻找一个变量的时候,首先会在当前的命名空间中寻找,如果当前命名空间中没有,就到上一级的命名空间中找,以此类推,如果最后都没找到,则触发变量没找到的异常。

我们之前一直说:全局作用域无法访问局部作用域,而局部作用域能够访问全局作用域就这这个原因。而当我在局部作用域创建了一个和外面同名的变量时,python在找这个变量的时候首先会在当前作用域中找,找到了,就不继续往上一级找了。

在早期的python版本时,局部作用域是不能访问其他的局部作用域的,只能访问全局的,而现在的版本都是依次向上一级找,这里就提一下。

也就是因为这个特性,我们可以在内部函数中访问外部函数中的变量,这也就是所谓的闭包了。

注意:这里要做好对象之间的区分,例如:

深入理解python中的闭包和装饰器(深入python3)

在这里,我们虽然都是操作 wai_hanshu 中的变量,但是 a 和 b 完全是两个对象,它们所在的内存空间也是不同的,所以里面的数据也是独立的。要注意不要搞混。

装饰器

其实装饰器就是在闭包的基础上多进行了几步,看代码:

在看这段代码的时候,要知道几件事:

1.函数的参数传递的其实是引用,而不是值。

2.函数名也是一个变量,所以可以重新赋值。

3.赋值操作的时候,先执行等号右边的。

只有明白了上面这些事之后,再结合一下代码,应该就能明白什么是装饰器了。所谓装饰器就是在闭包的基础上传递了一个函数,然后覆盖原来函数的执行入口,以后调用这个函数的时候,就可以额外实现一些功能了。装饰器的存在主要是为了不修改原函数的代码,也不修改其他调用这个函数的代码,就能实现功能的拓展。

而python觉得让你每次都进行重命名操作实在太不方便,于是就给出了一个便利的写法:

这些小便利也叫做python的语法糖,你可能在很多地方见过这个说法。

带参数的装饰器:

相当于: login = zsq()(login) ,所以在这里没有调用就执行了。

装饰器的嵌套:

这里就不完整写个例子了:

相当于: func = deco1(deco_arg)(deco2(func))

也就是从上到下的嵌套了。

关于闭包和装饰器就先讲到这里,以后有需要再补充。

以上这篇深入理解python中的闭包和装饰器就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

Python备份目录及目录下的全部内容的实现方法 本来是想写一个东西可以直接调用TortoiseSVN保存当前代码到一个分枝下的。可惜调用SVN的部分还在研究。就先写了目录拷贝的部分。如果有喜欢研究Python

python中函数总结之装饰器闭包详解 1、前言函数也是一个对象,从而可以增加属性,使用句点来表示属性。如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在

python中根据字符串调用函数的实现方法 在python中可以根据字符串来调用函数:1、使用getattr从字符串来调用函数在多进程中,可能传递过来的是一个字符串,那么我怎么来调用一个已经存在的

标签: 深入python3

本文链接地址:https://www.jiuchutong.com/biancheng/387609.html 转载请保留说明!

上一篇:Python编码爬坑指南(必看)(python坑人代码)

下一篇:Python备份目录及目录下的全部内容的实现方法(python 备份文件夹)

  • 动态市盈率与静态市盈率区别百度百科
  • 期末留抵税额怎么算开票金额
  • 纳税调整减少额是什么意思
  • 汇算退回的所得税分录
  • 向个体工商户付款可以现金支付吗
  • 废旧物资收购发票取消
  • 普通发票辨别真伪
  • 购买完货物又退回怎么办
  • 补偿性余额利息的计算公式
  • 事业单位开办费账务处理
  • 房屋建筑物评估技术鉴定表
  • 按税收规定计算的扣除额公益性捐赠
  • 境内企业得到境外企业的红利是否需要缴纳所得税?
  • 劳务发票个人所得税计算器
  • 公益性捐赠公告
  • 税务登记五证合一是哪五证
  • 固定资产处理怎么入账
  • 转让股权凭证怎么写
  • 离职补偿怎么做工资
  • 待处理财产损益计入资产负债表哪里
  • 营业执照办理流程需要多久
  • 1697507434
  • 业委会是否要交税
  • 支付境外关联方借款利息需要的
  • 委托加工应税消费品收回后直接销售
  • 先计提社保还是先计提工资
  • 分配水电费包括税费吗
  • 应交税费的销项税额怎么算
  • php在apache中有哪些工作方式
  • 被收购企业会提出什么条件
  • 前端打包发布
  • 作废的普通发票,顾客联拿不回来
  • 以旧换新直接给钱吗
  • 拉贾安帕特群岛地图中文版
  • php中文编程
  • 基建项目招标流程
  • 收到某单位投入一批原材料
  • 10万以下销售额怎么算
  • mongodb副本集群
  • 个人注册公司是否可以免税
  • 如何理解合并报表编制程序中的调整与抵消处理
  • 购买软件多少钱进无形资产
  • 业务招待费专票可以抵扣吗
  • 营业利润净利润利润总额的区别
  • 研发设备的折旧计入研发费用吗
  • 汇算清缴涉及的税种
  • 提取备用金记账凭证号的入账范围
  • 调整以前年度费用如何做分录
  • 房租费用计入什么现金流量
  • 文化传媒公司的主营业务
  • 无发票费用可以入账吗
  • 预收账款核算如何做账
  • 没有发票就不能保修吗
  • 目标考核奖金做什么科目
  • 银行账户维护费收费标准
  • 会计的几种折旧类型
  • 发票丢失如何处理入账
  • mysql column is ambiguous
  • 微软星期二补丁KB3022345导致USB设备无法识别怎么办?
  • win8.1纯净版下载
  • deepin直接安装
  • created directory cfg怎么办
  • mac如何全屏窗口
  • win8.1网络设置
  • win8自带截图
  • ie支持es6
  • js中创建对象的几种方法
  • bat读取文件内所有内容
  • html中滚动条
  • unity networking
  • 工具的图
  • 江苏省高新区地图
  • 为什么虚开增值税属于犯罪行为
  • 12366纳税服务热线工作时间
  • 小规模企业零申报怎么操作
  • 如何在电子税务局申报社保
  • 小规模纳税人个税税率
  • 税务局纪检组为税收工作纪律保障
  • 珠海选调生2021公告
  • 请问在哪里可以培训护工
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设