无参数装饰器

对于python小白来说,python的装饰器简直让人懵逼,不知如何理解,其实按照装饰器的字面意思,

就是把自己定义的函数装饰一遍,然后返回一个新的函数(注意是新的,已经不是本来定义的函数了)

为什么这么说,我用一个装饰器最原始的例子来说明,看一下代码:

 #装饰函数
def decorator(foo):
def wrapper():
print 'wrapper'
return foo()
return wrapper #自定义函数
def abc():
print 'abc' #装饰abc
abc = decorator(abc)

以上就是装饰器的过程,可以看出调用decorator函数,返回的是wrapper函数对象,而不是abc这个函数对象,

abc这个函数在wrapper中已经是被调用了的,只是返回一个结果。以上代码的运行结果如下图,可以看出装饰

之后的abc是wrapper的函数对象,而不是原来函数了。

而python的语法糖'@'就是执行了以上的过程,下面的代码和上面的代码原理是一样的:

 def decorator(foo):
def wrapper():
print 'wrapper'
return foo()
return wrapper @decorator
def abc():
print 'abc'

python的装饰器语法就是自动调用decorator函数,并以自定义的函数abc函数对象为参数,

返回wrapper函数对象,这样一个过程。

带参数的装饰器:

接下来,再深一步来说说带参数的装饰器, 其实这个只比上面那个无参数装饰器多了一步,

就是先调用装饰器函数,再返回真正的装饰器,之后的步骤和无参数的一样了,说得太抽象?

直接上代码,这样就明显了,先调用用最外层的函数,返回的是一个真正的装饰器,然后像

之前无参数的时候一样,修饰abc函数后返回新的函数对象。

 def decoratorFunc(arg):
def decorator(foo):
def wrapper():
if arg == 0:
print 'lalala'
return foo()
return wrapper
return decorator deco0 = decoratorFunc(0)
deco1 = decoratorFunc(1) abc0 = deco0(abc)
abc1 = deco1(abc)

然后python的语法糖的过程也是像上面那样了,所以我得出一个结论,就是@后面一定是一个

函数对象,而非函数调用!

 @decoratorFunc(0)
def abc():
print 'abc'

最后

写更普通的装饰器,如果被装饰的函数有参数怎么办?很简单,利用python的可变长度参数就行。

注意,是在wrapper这个函数上我们写上python的可变长度参数,而装饰器函数decorator的参数

永远只有一个,就是函数对象。看以下代码,是无参数装饰器的例子,如果是带参数的函数,也只

需要把wrapper改成接收可变长度参数就行。

 def decorator(foo):
def wrapper(*args, **kwargs):
print 'wrapper'
return foo(*args, **kwargs)
retrun wrapper @decorator
def abc(arg):
print 'abc:', arg

作者:陈栋权

时间:2016/09/05

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,

且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如有特别用途,请与我联系邮箱:kingchen.gd@foxmail.com

最后有兴趣的同学可以关注我的微信公众号,可以随时及时方便看我的文章。*^_^*

扫码关注或者搜索微信号:King_diary

个人关于python装饰器的白痴理解的更多相关文章

  1. Python装饰器的通俗理解

    转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...

  2. (一)Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  3. python装饰器的简单理解

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...

  4. Python装饰器的深入理解

    装饰器 #装饰器:本质上是函数,(装饰其他函数)就是为其他函数添加附加功能 #原则: 1.不能修改被装饰的函数的源代码 # 2.不能修改被装饰的函数的调用方式 #实现装饰器知识储备 #1.函数即变量 ...

  5. python 装饰器的详细理解【多次实验】

    demo: # 装饰器其实就是对闭包的使用 print('haha嘻嘻') def hot(): print('知道') def dec(fun): print("call dec" ...

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

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

  7. 如何理解Python装饰器

    如何理解Python装饰器?很多学员对此都有疑问,那么上海尚学堂python培训这篇文章就给予答复. 一.预备知识 首先要理解装饰器,首先要先理解在 Python 中很重要的一个概念就是:“函数是 F ...

  8. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  9. 理解 Python 装饰器看这一篇就够了

    讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...

随机推荐

  1. [Linux] 输出文件的指定行

    1.获取第k行(以k=10为例) 要注意的是,如果文件包含内容不足10行,应该不输出. # Read from the file file.txt and output the tenth line ...

  2. python基础(二)----数据类型

    Python基础第二章 二进制 字符编码 基本数据类型-数字 基本数据类型-字符串 基本数据类型-列表 基本数据类型-元组 可变.不可变数据类型和hash 基本数据类型-字典 基本数据类型-集合 二进 ...

  3. Android Bluetooth 总结

    一.Android Bluetooth现状 (1)Android2.2版 支持的蓝牙核心版本是Bluetooth 2.0 + EDR. (2)Android 的蓝牙 使用了BlueZ协议栈,但只实现了 ...

  4. jquery.treetable.js

    html:   <table class="table table-hover table-responsive main-list" id="columntabl ...

  5. Ubuntu下使用openssl为apache2配置ssl

    安装apache2 sudo apt-get install apache2 安装openssl 一般系统自带,可以通过openssl version查看,如果没有, sudo apt-get ins ...

  6. MVC MVVM和传统三层的理解

    才学疏浅,请勿喷,如果有理解不对的地方请留言 其实,每个小小的程序员都有个毛病,就是反复写一个东西会觉得这个东西没有新意. 就像让你写三层,你却还是觉得想写MVC模式. 软件小公司做B/S的大部分还是 ...

  7. Uva12230Crossing Rivers (数学期望)

    问题: You live in a village but work in another village. You decided to follow the straight path betwe ...

  8. iPhone4s 9.2.1安装cydia(越狱)

    依据网上资料而来 主要就是上图视频中的6步骤选项,不要选错. 1.prepare for jailbreak 2.选择Accept 3. proceed with jailbreak 4.begin ...

  9. altera官方推荐时钟使用方法

    Register Combinational Logic Outputs If you use the output from combinational logic as a clock signa ...

  10. altium常用快捷键记录

    选中一个网络的点和线ctrl+h: 翻转器件的层 鼠标拖动+L: 镜像器件 鼠标拖动+x: 查看单一层shift+s: 隐藏/查看某些器件ctrl+d: