今天看去年整理的python笔记,发现了当年匆匆书写的一些疑惑,今天下午请教了小熊之后,突然畅快十分~~
jeremy lin
现在趁着跑实验的间隙,重新梳理一遍这方面的知识,加深了解。
什么是装饰器
装饰器(decorator)是在python 2.4中引入的一种新语法,它能够对任何可调用的对象进行包装,既可以用于方法也可以用于函数。【Decorators provide a simple syntax for calling higher-order functions. By definition, a decorator is a function that takes another function and extends the behavior of the latter function without explicitly modifying it.】
如果你看了上面的话之后还不是很理解什么是装饰器,那么,接下来我们来看看怎么用,就知道了
什么时候使用装饰器
我们先想象这样一个情况——你需要在测试几十个函数的运行时间,这个时候,一个方法就是你去每个函数内部加上time.time()来获得程序的运行时间和结束时间,也即是你修改这几十个函数,很显然,这非常麻烦。那么在python中,如何简便地实现这个情况呢?——使用装饰器(decorator),可以看到,这个时候装饰器的作用就是对函数进行包装来扩展它的功能,而不需要重写函数本身。还有一个场景就是给函数加logger功能,更多的我还没遇到~
下面看一个例子:
原始函数fun1()、装饰函数newf()【这个函数以另一个函数为参数输入】,我们定义好newf()之后,就可以利用@符号对很多函数进行包装扩展,即是只需要在你想要包装的函数的上面加一个“@newf”,如下所示:
def newf(fun): def wrapper(): start_time = time.time() fun() end_time = time.time() print end_time - start_time return wrapper @newf def fun1(x): return x**5上面过程等效于:
fun1 = newf(fun1)这个时候fun1的功能就比原来的fun1多了统计运行时间的功能了。
想知道更多
更多的内容可以参考如下的博文:
[1] 左耳朵耗子的博文:Python修饰器的函数式编程,http://coolshell.cn/articles/11265.html
[2] http://www.wklken.me/posts/2013/07/19/python-translate-decorator.html#
[3] A guide to Python's function decorators http://thecodeship.com/patterns/guide-to-python-function-decorators/
[4] 可爱的 Python: Decorator 简化元编程 http://www.ibm.com/developerworks/cn/linux/l-cpdecor.html