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装饰器的语法回 ...
随机推荐
- Common Gateway Interface Python CGI编程
https://en.wikipedia.org/wiki/Gateway_(telecommunications) In telecommunications, the term gateway r ...
- django模板语言转义处理
模板变量的内容,如果含html的话,django的模板系统默认会对输出进行转义,比如把<p>转义成了<p> ,然后再显示出来的时候就如实地显示为<p>.要解决这个问 ...
- 基于bind搭建DNS主从
使用bind的主从复制功能可以实现的功能:提供冗余,避免单点故障:均衡负载查询需求,从而提高系统可用性. 一.安装 #bind-chroot 负责DNS安全作用,将bind进程严格限制在特定的目录中 ...
- Prime Path--POJ3126(bfs)
Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...
- cookie的封装写法
设置cookie 三个参数分别代表:键,值,过期时间,这个封装方法可以完成cookie的储存 以及cookie的删除(过期时间设为赋值) function setCookie(cname,cval ...
- Linux新建用户 useradd&groupadd
建立一个新组,并设置组ID加入系统:#groupadd -g 1000 sparkgroup #useradd -u 2000 -g sparkgroup sparkuser #mkdir -p /a ...
- 【JMeter】集合点的设置
[JMeter]集合点的设置 简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念,我们可以在需要压力的地方设置集合点,每到输入用户名和密 ...
- (3.3)mysql基础深入——mysql启动深入分析
基础:(2.1)学习笔记之mysql基本操作(启动与关闭) 0.mysql启动的 3种方式 (1)mysql.server (2)mysqld_safe (3)mysqld 1.启动分析 [1.1]概 ...
- MySQL DBA 管理常用命令
一:在Linux下管理MySQL数据库的时候总有一些很紧急的情况,发现数据库突然变得压力很大了,那么作为一个DBA,也许需要一些常用的手段或者说命令去分析问题出现在哪里,然后解决: 数据库突然产生压力 ...
- XtraBackup完整备份与增量备份的原理
MySQL数据库实现备份的操作包括完整备份和增量备份等,本文我们主要介绍一下增量备份和完整备份的原理,接下来我们就一起来了解一下这部分内容. 完整备份的原理: 对于InnoDB,XtraBackup基 ...