python 装饰器的本质
来源:互联网 发布:eos utility mac 下载 编辑:程序博客网 时间:2024/06/04 18:49
转载:http://blog.csdn.net/handsomekang/article/details/39997163
很多人把装饰器搞的很复杂,其实本质很简单.
首先,什么是装饰器呢?在代码中发现戴着@xxx帽子的,就是装饰器.
那要怎么自己定义一个装饰器呢?
其实任何一个接收一个参数的callable都可以用来做装饰器,比如函数和类.为方便起见,下面的例子都用函数来说明.
def deco(func):return 1
这里,deco就可以做装饰器
@decodef f(args):pass
“戴帽”其实就是调用,帽子戴在谁(一个函数定义)头上,就表示将谁作参数来调用,然后赋给一个同名变量.
上面的例子等价于f = deco(f).结果是函数f变成了1.
当然,我们用装饰器可不是用来返回1的.我们主要目的是”保持原有函数功能,增加额外功能”.
那我们就定义一个装饰器”接收一个函数作参数并返回一个函数”.
def deco(func): return func
这样我们可以在return func之前加代码做手脚增强功能,但是如果还需要在执行func后做手脚呢?还需要捕获func的参数args做手脚呢?于是我们用另外一个函数来包装.
得益于”函数是一等公民”,我们可以在函数里面定义函数.这就是装饰器最常用的定义形式,形式如下
def deco(func): def newfunc(*args, **kwargs): func(*args, **kwargs) return newfunc
其中*args, **kwargs用来捕获参数.
我们要在函数执行前后输出信息,只需要
def deco(func): def newfunc(*args, **kwargs): print 'before' ret = func(*args, **kwargs) print 'after' return ret return newfunc
理解了本质后,什么乱七八糟的”不带参数的装饰器”/”带参数的装饰器”/”函数装饰器”/”类装饰器”/”多个装饰器”/”为什么@route能自动收集url”等等等等都是表象了.
带参数的装饰器?
你把它当作一个函数调用就行了
0 0
- python 装饰器的本质
- 飘逸的python - 装饰器的本质
- Python装饰器的本质理解
- Python的装饰器
- python的装饰器
- python的装饰器
- Python的装饰器
- python的装饰器
- Python的装饰器
- python里的装饰器
- python 装饰器的使用
- python-装饰器的学习
- Python的装饰器(decorator)
- python装饰器的使用
- python-装饰器的学习
- 关于python的装饰器
- python 装饰器的使用
- Python 装饰器的理解
- Facade Pattern
- Android中<meta-data>的使用
- 清除HtmlAgilityPack得到的InnerText中残留的script
- Leetcode: Rotate Array
- Mac 常用操作
- python 装饰器的本质
- fatal error C1083: 无法打开预编译头文件
- hdu5122
- 黑马程序员——Map接口
- 在Mac OS系统下PyCharm编辑器的Hello word程序
- 阿里云服务器数据盘挂载
- 杭电(hdu)2070 Fibbonacci Number 水题
- log4j日志配置详解
- 安装WordPress