Python学习笔记:装饰器

今天看去年整理的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



更多资源 请关注 博客:LinJM-机器视觉 微博:林建民-机器视觉








你可能感兴趣的:(python,装饰器)