装饰器(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
原创粉丝点击