Python学习笔记:装饰器
2015-08-22 18:02
711 查看
今天看去年整理的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-机器视觉 微博:林建民-机器视觉
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 基金会 —— 模块和包简介
- 做题
- Python - 2
- Python第一天 - 迭代
- Python中的装饰器和函数式
- python写csv文件
- Python第一天 - list\字符串截取
- 机器学习—— 基于朴素贝叶斯分类算法构建文本分类器的Python实现
- 白话陈述之——从python脚本变化解析由路径引起的GP服务运行失败问题
- 白话陈述之——从python脚本变化解析由路径引起的GP服务运行失败问题
- Python之requests的安装
- Python第一天 - 函数
- Python__XPath+多线程实例
- PIL安装
- tiny_mce
- 解释型语言和编译型语言的不同以及Python如何运行
- Parallel Programming in Python
- [python] 命令行参数
- Python第一天 - set
- Python中的 getopt模块