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 ...
随机推荐
- app开发外包注意事项,2017最新资讯
我们见过很多创业者,栽在这app外包上.很多创业者对于app外包这件事情不是特别重视,以为将事情交给app外包公司就完事了,实际上不是的.无论是从选择app外包公司还是签订合同.售后维护等各方面都有许 ...
- SQL Server 2014 新特性——内存数据库
SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...
- .NET跨平台之运行与Linux上的Jexus服务器
谈及.NET跨平台,已经不是什么稀奇的事儿.今天我们就以Jexus服务器的部署为例.简单示范下.在这里,我用VMWare虚拟机来搭建Linux运行环境. Linux,我们选择CentOS7.大家可以前 ...
- jsp页面无法识别el表达式的解决方案
今天在写一个springmvc的小demo时,碰到一个问题,在jsp页面中书写为${user.username}的表达式语言,在浏览器页面中仍然显示为${user.username},说明jsp根本不 ...
- “fixed+relative==absolute”——对BFC的再次思考
好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...
- C# salt+hash 加密
一.先明确几个基本概念 1.伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的.伪随机数并不是假随机 数,这里的" ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- 【干货分享】流程DEMO-补打卡
流程名: 补打卡申请 业务描述: 当员工在该出勤的工作日出勤但漏打卡时,于一周内填写补打卡申请. 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: 流程: 图片 ...
- JavaScript 写计算器改进版
<html><head><style> .short{height:50px;width:55px;float:left;}</style></h ...
- 读过MBA的CEO更自私?《哈佛商业评论》2016年第12期。4星
老牌管理杂志.每期都值得精度.本期我还是给4星. 以下是本书中的一些内容的摘抄: 1:他们发现在Airbnb上,如果客人姓名听起来像黑人,那么比名字像白人的客人的接受率会低16%.#45 2:对立组织 ...