装饰器(Decorator)
来源:互联网 发布:sql约束表达式大全 编辑:程序博客网 时间:2024/06/07 19:45
函数也是对象
在python中,函数也是对象,它有自己的方法,它可以传递下去。
函数传递
>>> def brown(): print 'brown'>>> new_brown = brown # 函数对象传递>>> new_brown()brown
什么是装饰器
装饰器实际上是函数,它以函数对象为参数,可以在它所装饰的函数的前或后添加一些其它的操作。你可以在执行(被装饰的)函数之前做一些预准备工作,也可以在执行(被装饰的)函数之后做一些清理工作,比如事后分析。
通常,当你wrap一个函数时,你应该在wrapper里调用它。你可以在wrapper里面随时调用它,这是很好的一点。
>>> def deco(func): # 定义装饰器 def wrapper(): print 'Do something prepared!' func() print 'Do something cleanup!' return wrapper>>> @deco # 使用装饰器 def hello(): print 'Hello Brown!'>>> hello()Do something prepared!Hello Brown!Do something cleanup!
注意:
我们在使用装饰器时使用了下述语法:
@decodef foo(): # To do something
其实等价于下述语法:
def foo(): # To do somethingfoo = deco(foo)
装饰器的作用
装饰器可以用来:
- 引入日志
- 增加计时逻辑来检测性能
- 给函数加入事务的能力
带参数的装饰器
注意,上面所讲的装饰器是没有参数的,e.g.@deco
;如果我们需要给装饰器传递参数,我们需要:定义一个返回(以被装饰函数作为参数的)装饰器的函数。有点拗口,简单地说,就是在我们之前的装饰器函数外再包裹一层函数,这个函数返回我们定义的无参数装饰器。
>>> def deco_param(param): def deco(func): def wrapper(): print 'Do something prepared!' print 'Param is %s!' % param func() print 'Do something cleanup!' return wrapper return deco>>> @deco_param('BrownWong')def hello(): print 'Hello Brown!'>>> hello()Do something prepared!Param is BrownWong!Hello Brown!Do something cleanup!
注意:
@deco_param(param)def hello(): # To do something
等价于
def hello(): # To do somethinghello = deco_param(param)(hello)
堆积装饰器
装饰器可以堆积起来,如下
@deco1@deco2def func(): # To do something
它等价于:
func = deco1(deco2(func))
Ref
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000
《Python核心编程》(第二版)
0 0
- 装饰器(Decorator)
- 装饰器(Decorator)
- decorator(HTML装饰器)
- Decorator(装饰器模式)
- 装饰器模式(Decorator)
- Python 装饰器( Decorator)
- 装饰器模式(Decorator )
- Decorator(装饰器)模式
- 装饰器模式(Decorator)
- 装饰器模式(Decorator)
- 装饰器模式(Decorator)
- decorator(HTML装饰器)
- 装饰器模式(Decorator)
- python装饰器(decorator)
- Python中的Decorator(装饰器)模式
- JAVA设计模式:装饰器(Decorator)
- Python和Decorator(装饰器)模式
- 装饰器(Decorator)in Java
- ProxyFacotroy源码解析
- 字符与字符串
- EasyPusher Android实时推送当前屏幕画面
- 不再以讹传讹,GET和POST的真正区别
- 折腾树莓派(四)使用gitosis创建git托管服务器
- 装饰器(Decorator)
- TypeError document.getElementById(...) is null错误原因
- 亚像素边缘检测评述
- 加快 iTunes 从苹果 App Store 下载速度
- blkid命令在rhel5.8之前的版本中的小bug
- 中断下半部之工作队列
- php在对象之外访问其私有属性private及保护属性protected的特例
- UIEventListener
- 阻塞与非阻塞的区别