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 ...
随机推荐
- vue2.0实践的一些细节
最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...
- webapi - 模型验证
本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬 ...
- ASP.NET加密和解密数据库连接字符串
大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...
- PHP类和对象之重载
PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的.属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值.读取.判断属性是否设置.销毁属性. ...
- 《LoadRunner12七天速成宝典》来了
看到自己的新书又要发行了,算算从09年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...
- 手把手教你写一个RN小程序!
时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...
- gulp批量打包文件并提取公共文件
gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器. browseriyf是模块化打包工具. 一般情况下,Browserify 会把所有的模块打包成单个文件.单个文件在大多数情况下是 ...
- SpringMVC入门
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模 ...
- fedora上部署ASP.NET——(卡带式电脑跑.NET WEB服务器)
andrew,20130601,guilin 本文记录在树莓派(fedora)上部署ASP.NET MVC2 的过程. 本文共分为六部分,分别是前置条件,Apache的安装,Mysql的安装,安装mo ...
- SVG:textPath深入理解
SVG的文本可以沿着一条自定义的Path来排布,比如曲线.圆形等等,使用方式如下所示(来源MDN): <svg viewBox="0 0 1000 300" xmlns=&q ...