python装饰器,其实就是对闭包的使用。
装饰器
理解装饰器要先理解闭包(在闭包中引用函数,可参考上一篇通过例子来理解闭包)。
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
装饰器的实质就是对闭包的使用,原函数被当作参数,处理完的返回值又赋给原函数。
- 装饰器用来装饰函数;
- 返回一个函数对象;
- 被装饰函数标识符指向返回的函数对象;
- 语法糖 @dec
通过一个例子体会,和前边的在闭包中引用函数进行对比。很像。
Def dec(func):
Print(’call dec’)
Def in_dec(*arg):
Print (‘in dec arg=’, arg)
If len(arg) == 0:
Return 0
For val in arg:
If not isinstance(val,int):
Return 0
Return func(*arg)
Return in_dec
@dec
Def my_sum(*arg): #my_sum = in_dec
Print (‘in my_sum’)
Return sum(arg)
Print (my_sum(1,2,3,4,5))
结果:
Call dec
n dec arg=(1,2,3,4,5)
in my sum
15
执行过程:首先由于@dec,代码会调用函数dec,而且这个函数的参数就是原函数my_sum。装饰器会返回新的函数对象in_dec,同时My_sum被当作了enclosing内部变量被in_dec使用。然后会被my_sum接收,被装饰的函数指向新的函数。my_sum = in_dec,然后内部调用了最原来的my_sum函数。
python装饰器,其实就是对闭包的使用。的更多相关文章
- python 装饰器、内部函数、闭包简单理解
python内部函数.闭包共同之处在于都是以函数作为参数传递到函数,不同之处在于返回与调用有所区别. 1.python内部函数 python内部函数示例: def test(*args): def a ...
- Python装饰器与闭包
闭包是Python装饰器的基础.要理解闭包,先要了解Python中的变量作用域规则. 变量作用域规则 首先,在函数中是能访问全局变量的: >>> a = 'global var' & ...
- Python装饰器,Python闭包
可参考:https://www.cnblogs.com/lianyingteng/p/7743876.html suqare(5)等价于power(2)(5):cube(5)等价于power(3)(5 ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- python 装饰器 一篇就能讲清楚
装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...
- Python装饰器模式学习总结
装饰器模式,重点在于装饰.装饰的核心仍旧是被装饰对象. 类比于Java编程的时候的包装模式,是同样的道理.虽然概念上稍有不同但是原理上还是比较相近的.下面我就来谈一谈我对Python的装饰器的学习的一 ...
- Python装饰器的另类用法
之前有比较系统介绍过Python的装饰器(请查阅<详解Python装饰器>),本文算是一个补充.今天我们一起探讨一下装饰器的另类用法. 语法回顾 开始之前我们再将Python装饰器的语法回 ...
随机推荐
- ddt ddl dml
data-definition language 数据定义语言 data-manipulation language 数据操纵语言 data type definition 文档类型定义
- iOS - UITableView 编辑(cell的插入, 删除, 移动)
UITableView Cell的插入/删除 核心API Class : UITableView Delegate : UITableViewDataSource, UITableViewDelega ...
- Python爬虫实例(六)多进程下载金庸网小说
目标任务:使用多进程下载金庸网各个版本(旧版.修订版.新修版)的小说 代码如下: # -*- coding: utf-8 -*- import requests from lxml import et ...
- css3的一个小demo(箭头hover变化)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python2.7+pyqt4实现记事本基本功能
记事本程序: # coding:utf-8 import sys from PyQt4.QtGui import QMainWindow from PyQt4.QtGui import QApplic ...
- MySQL数据库参数
数据库参数 MYSQL数据库的参数配置一般在my.ini配置文件中修改/添加(部分参数也可以用set global 参数名=值 做临时调整,重启后失效),配置完后需要重启数据库才生效. 参数1:inn ...
- Scala系统学习(二):Scala开发环境安装配置
Scala可以安装在任何基于UNIX/Linux或基于Windows的系统上.在您的机器上开始安装Scala之前,必须在计算机上安装Java 1.8或更高版本. 下面请按照以下步骤安装Scala. 步 ...
- Gcc ------ gcc的使用简介与命令行参数说明
gcc的使用简介与命令行参数说明 2011年06月19日 20:29:00 阅读数:10221 2011-06-19 wcdj 参考:<GNU gcc嵌入式系统开发 作者:董文军> (一) ...
- 使用HttpClient进行远程接口测试
前两天在工作中,项目组长给我了一个远程接口让我给测一下,因为是http协议,所以我首先想到了用httpClient工具类来测试,网上一查,找到了好多示例代码,随便复制了一个demo进行了简单的修改,结 ...
- 使用JDBC+POI把Excel中的数据导出到MySQL
POI是Apache的一套读MS文档的API,用它还是可以比较方便的读取Office文档的.目前支持Word,Excel,PowerPoint生成的文档,还有Visio和Publisher的. htt ...