python decorator

无参和有参的装饰器

1:无参装饰器

@deco
def foo(): pass

这个类似于:

    foo = deco(foo)

2:有参装饰器

有参装饰器需要自己返回以函数作为参数的装饰器

@deco(deco_args)
def foo(): pass

这个类似于:

       foo = deco(deco_args)(foo)

其中deco(deco_args)需要返回一个函数对象,并且这个函数对象可以接受另一个函数对象作为参数


多个装饰器修饰同一个函数

@deco1(deco_args)
@deco2
def fun(): pass

这等价于: 

       fun = deco1(deco_args) (deco2(func))  #其中,deco(deco_args)返回一个函数对象

什么是装饰器?

装饰器实际上就是函数,这些函数接受函数对象。装饰器通常在函数定义的某处嵌入了对目标函数的调用或者至少一次的引用。从本质上看,这类似于java的AOP。

我们可以在装饰器中引入通用功能的代码来降低程序的复杂度,例如,装饰器可以用来:

   1:引入日至

   2:增加计时逻辑来检测性能

   3:给函数加入事物能力


装饰器的例子:

例子1:

from  time import ctime, sleep


def recordtime(func):
    def inner():
        print '[%s] %s() called' %(ctime(), func.__name__)
        func()
        print '[%s] %s() stoped' %(ctime(), func.__name__)
    return inner
    
@recordtime
def foo():
    sleep(5)
    
foo()


执行结果为:

[Thu Dec 17 05:16:27 2015] foo() called
[Thu Dec 17 05:16:32 2015] foo() stoped

这个装饰器就是添加了一个计时审计功能

例子2:

from time import time
def logged(when):
    def log(f, *args, **kargs):
        print '''Called:
        function: %s
        args: %r
        kargs: %r''' %(f.__name__, args, kargs)
        
    def pre_logged(f):
        def wrapper(*args, **kargs):
            log(f, *args, **kargs)
            return f(*args, **kargs)
        return wrapper
    
    def post_logged(f):
        def wrapper(*args, **kargs):
            now = time()
            try:
                return f(*args, **kargs)
            finally:
                log(f, *args, **kargs)
                print 'time delta: %s' %(time()-now)
        return wrapper
        
    try:
        return {'pre': pre_logged,
        'post': post_logged}[when]
    except KeyError, e:
        raise ValueError(e), 'must be "pre" or "post"'
        
        
        
@logged("post")
def hello(name):
    print 'hello', name
        
        
hello('world')

执行结果如下:

hello world
Called:
        function: hello
        args: ('world',)
        kargs: {}
time delta: 0.00204801559448

这里就是一个简单日志记录装饰器






你可能感兴趣的:(python学习)