python装饰器
今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的。
装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等。需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数。
装饰器需要用到@修饰符,我们举一个例子:
  
这个返回函数的函数是一个装饰器
然后我们定义需要被它装饰的函数,是这样的:
  
然后我们调用函数gril()便会打印如下内容:
  
那么这一过程如何实现呢,现在我不知道,我来研究。
首先查一下官方doc
  
========================= 中朝边境线 =========================
其实这个文档说的已经很清楚很好了。大概翻译一下:
一个函数定义可以被一个或者几个装饰器表达式包含(wrapped,此词用的尤为好,就是我们那个gril函数被boy函数包含了,这其实更有助于理解装饰器了)。在含有函数定义的区域内,当函数被定义时,装饰器是被评估的??(这里翻译不了,英语渣渣)。装饰器的返回结果是必须要能被调用的(也就是返回值是一个函数),他作为一个参数被这个函数对象调用。装饰器的返回值被和原来的那个函数的名字绑定来取代原来的函数对象。在嵌套样式里应用多个装饰器(抱歉,我也不知道我说了什么)。
我们看到他给的第一个例子等同于第一个例子,如果对应于我们上边举的例子那就是:
@boy
def gril():
print 'I am gril.'
就等同于
gril = boy(gril)
注意此时的gril已经变成了boy函数。验证一下

那么现在f2应该变成了f1(f2)
如果调用f2应该是两句都会打印,试一下

果真是。。-> _ ->
那么装饰器是怎么回事呢?
其实我们可以看到调用gril函数其实变成了调用boy函数的返回值也就是money函数,money函数先是打印了一句信息,然后它会返回原先gril函数的调用--原先的gril函数被执行了(原先gril函数已经在@修饰符下被当作参数传给boy函数了),所以它在打印完信息后返回原先gril的调用。
*args,**kw这两个参数是表示可以接收任意个数的参数的,这样不论原先gril函数有怎么样的形参,新的gril函数(也就是money)总是能够被正确的调用!!
这样就基本清楚了,注意我上边翻译官方文档提到的warp这个词,这个词是‘包含’的意思,也就是现在的gril已经变成了包含执行原先gril函数的money函数,这样不仅原先gril函数能被执行,而且money函数还可以自己添加一些功能被顺带的执行了。所以说啊,文档中这个warp用的很贴切,很温馨,犹如午后的阳光洒在单纯而广袤的程序猿们的心田,暖暖的。
  
python装饰器的更多相关文章
- 关于python装饰器
		
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
 - python装饰器通俗易懂的解释!
		
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
 - Python 装饰器学习
		
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
 - python 装饰器修改调整函数参数
		
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
 - python 装饰器学习(decorator)
		
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
 - Python装饰器详解
		
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
 - 关于python装饰器(Decorators)最底层理解的一句话
		
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
 - Python装饰器由浅入深
		
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
 - Python装饰器与面向切面编程
		
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
 - python装饰器方法
		
前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...
 
随机推荐
- Unity3d学习 预设体(prefab)的一些理解
			
之前一直在想如果要在Unity3d上创建很多个具有相同结构的对象,是如何做的,后来查了相关资料发现预设体可以解决这个问题! 预设体的概念: 组件的集合体 , 预制物体可以实例化成游戏对象. 创建预设体 ...
 - 深入理解BFC
			
定义 在解释BFC之前,先说一下文档流.我们常说的文档流其实分为定位流.浮动流和普通流三种.而普通流其实就是指BFC中的FC.FC是formatting context的首字母缩写,直译过来是格式化上 ...
 - Oracle Database 12c Data Redaction介绍
			
什么是Data Redaction Data Redaction是Oracle Database 12c的高级安全选项之中的一个新功能,Oracle中国在介绍这个功能的时候,翻译为“数据编纂”,在EM ...
 - ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之目录导航
			
ASP.NET MVC with Entity Framework and CSS是2016年出版的一本比较新的.关于ASP.NET MVC.EF以及CSS技术的图书,我将尝试着翻译本书以供日后查阅. ...
 - .net 大型分布式电子商务架构说明
			
.net大型分布式电子商务架构说明 背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便 ...
 - zookeeper源码分析之六session机制
			
zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...
 - zookeeper源码分析之一服务端启动过程
			
zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...
 - 【干货分享】流程DEMO-事务呈批表
			
流程名: 事务呈批表 业务描述: 办公采购.会议费用等事务的申请.流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金 ...
 - Android中的多线程断点下载
			
首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...
 - Java集合---ConcurrentHashMap原理分析
			
集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持.比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap).这篇文章主 ...