今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的。

  装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等。需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数。

  装饰器需要用到@修饰符,我们举一个例子:

  

这个返回函数的函数是一个装饰器

  然后我们定义需要被它装饰的函数,是这样的:

  

  然后我们调用函数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装饰器的更多相关文章

  1. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  2. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  3. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  4. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  5. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  6. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  7. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  8. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  9. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

  10. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

随机推荐

  1. 阿里签名中URLEncode于C#URLEncod不同之处

    问题 如上图所示,阿里云的PercentEncode 转换! 为 %21 PercentEncode 源码为: package com.aliyuncs.auth; import java.io.Un ...

  2. Winserver下的Hyper-v “未在远程桌面会话中捕获到鼠标”

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 服务器相关的知识点:http://www.cnblogs.com/dunitia ...

  3. EntityFramework Core 1.1是如何创建DbContext实例的呢?

    前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...

  4. PhpStorm和WAMP配置调试参数,问题描述Error. Interpreter is not specified or invalid. Press “Fix” to edit your project configuration.

    PhpStorm和WAMP配置调试参数 问题描述: Error. Interpreter is not specified or invalid. Press “Fix” to edit your p ...

  5. HTML 5 应用程序缓存manifest

    什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏 ...

  6. git快速get

    配置:git config --global user.name 'yangshaoxiang' git config --global user.email '254135495@qq.com' s ...

  7. DBobjectsCompareScript(数据库对象比较).sql

    use master goIF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[func_CompareDBobjectsReColu ...

  8. win10电脑优化

    Windows10必做的优化 --道心 关闭服务 右键点击"此电脑",选择"管理",进入"计算机管理"窗口. 在左侧的菜单选择"服 ...

  9. POJ2774 Long Long Message [后缀数组]

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 29277   Accepted: 11 ...

  10. 用ffmpeg快速剪切和合并视频

    如果直接找视频剪切和合并视频的软件,通常出来的都是大的视频编辑软件或者是有图形界面的剪切软件,大型一点的功能太多安装麻烦,小型一点的功能可能不齐全. 只是简单的剪切或者一下合并一下,还是ffmpeg这 ...