| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> python闭包与装饰器 -> 正文阅读 |
|
[Python知识库]python闭包与装饰器 |
python闭包与装饰器Catalogue一、什么是闭包?1、函数的作用域首先我们先明白python的一个变量的作用域,python对于每一个变量都有其的命名空间namespace,一个函数只能调用global全局变量或者是这个函数自己的local局部变量。清楚了这一点后,那什么是闭包呢。 2、什么是闭包?简单地说,闭包就是由其他函数动态生成并返回的函数,其关键性质是,被返回的函数可以访问其创建者(这里的创建者一般指的是最外层的函数)的局部命名空间中的变量。 3、闭包的作用闭包可以避免使用全局值并提供某种形式的数据隐藏。它还可以提供面向对象的解决问题的解决方案。当在类中几乎没有方法(大多数情况下是一种方法)时,闭包可以提供一个替代的和更优雅的解决方案。 但是当属性和方法的数量变大时,更好地实现一个类。 4、举两个闭包的例子
这个例子中,我们的闭包可以接受外部函数的一个变量,并且打印它,内部函数暂时不执行任何功能。内部函数在单独执行时,仍然保留了外部函数的自由变量a的绑定,这就是一个简单的闭包。
在这个例子中,multiple函数接受make_multiple_of函数指定的幂,在multiple函数单独执行的时候,仍然保留了make_multiple_of的变量绑定,完成了求次方的功能。 5、闭包的__closure__属性闭包比普通的函数多了一个 closure 属性,该属性记录着自由变量的地址。
二、装饰器1、普通的装饰器实际上,实现特殊方法 写在前面,在python中一切皆对象,函数也不例外,所以我们可以将函数赋值另外的变量,使这两个变量指向同一个函数的引用。 先定义一个简单的装饰器
为了使用我们定义好的装饰器,我们可以这样调用:
这样我们其实是利用了闭包,打包保留了一些自由变量的绑定,将ordinary函数再赋给本身,但是这时的ordinary函数与一开始的函数多了一些变量的绑定,还是可以像调用之前的ordianry函数一样调用它。
2、装饰器语法糖我们可以使用
3、标准的计时装饰器模板这里写一个可以计算函数运行时间的装饰器,提供一种写装饰器的思路。
4、总结装饰器的典型行为可以概括为,通过闭包,接受并且绑定一些自由变量,把被装饰的函数替换成新的函数,二者接受相同的参数,而且(通常)返回被装饰的函数本该返回的值,同时还进行一些额外的操作。
三、装饰器工厂函数(参数化装饰器)Python把被装饰的函数作为第一个参数传给装饰器函数,那怎么让装饰器接受其他的函数呢?答案是:创建一个装饰器工厂函数,把参数传给它,返回一个装饰器,然后再把它应用到要装饰的函数上。 由于装饰器是带参数的,所以我们再利用语法糖的时候也需要带上参数 一般来说,装饰器需要两层函数嵌套,由于装饰器工厂函数需要接受参数,所以装饰器工厂函数需要三层函数嵌套。
查看有哪些函数是注册的,func1是没有注册的,所以结果中没有func1 四、Referencehttp://c.biancheng.net/view/5335.html |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 23:49:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |