Python -- 装饰器

在代码运行期间动态增加函数功能的方式,称之为“装饰器”(Decorator)。

def log(func):
    def wrapper(*args, **kw):
        print 'call %s():' % func.__name__
        return func(*args, **kw)
    return wrapper

@log
def now():
    print '2013-12-25'
def log(text):    #带参数版装饰器
    def decorator(func):
        def wrapper(*args, **kw):
            print '%s %s():' % (text, func.__name__)
            return func(*args, **kw)
        return wrapper
    return decorator

完整版

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print 'call %s():' % func.__name__
        return func(*args, **kw)
    return wrapper

#functools的作用:把原始函数的__name__等属性复制到wrapper()函数中

也可以给一个函数添加多个装饰器

def memorize(f):
    cache = {}
    def helper(x):
        if x not in cache:
            cache[x] = f(x)
        return cache[x]
    return helper

def trace(f):
    def helper(x):
        call_str = "{0}({1})".format(f.__name__, x)
        print("Calling %s..." % call_str)
        result = f(x)
        print("...returning from %s = %s" % (call_str, result))
        return result
    return helper
    
    
    
@memorize
@trace
def fib(n):
    if n in (0,1):
        return 1
    else:
        return fib(n-2)+fib(n-1)

        
fib(5)
KEEP LEARNING!
原文地址:https://www.cnblogs.com/roronoa-sqd/p/4899284.html