Closure

Python 中有decorator这个概念首先要归功于python支持function closure : inner functions defined in non-global scope remember what their enclosing namespaces looked like at definition time.

比如:

def outer():
    x = 1
    def inner():
        print x
    return inner

foo = outer()
foo()

根据python的variable lifetime, x是outer的local variable.那么当outer返回后x应该不存在了。但在这里我们通过

print [c.cell_contents for c in foo.__closure__]

可以看到x还是存在的。被记录到了inner function的__closure__这个属性里面.

Function is an object

其次就是在python中,everything is object. 函数也是object, 而且是first class object. 比如:

def foo():
    pass
foo.__class__ # <type 'function'>
issubclass(foo.__class__, object) # True

这就表示function也可以作为普通的object传给另一个function作为参数. 比如:

def outer(func):
    def inner():
        print "before function"
        ret = func()
        return ret+1
    return inner

def foo():
    return 1

decorated = outer(foo)
ret = decorated() #before function
print ret #2

而且foo.__name__就是代表函数的名字。通过

from functools import wraps 
def outer(func):
    @wraps(func)
    def inner():
        print "before function"
        ret = func()
        return ret+1
    return inner

这样使得decorator返回的被装饰后的函数的名字function.__name__和原函数相同。

args and *kwargs

如果没有这两个可以代表任意函数参数的变量,那么每一个function都是要事先确定好参数的个数,decorator的作用范围变窄了。 比如:

def logger(function):
    def inner(*args,**kwargs):
        # some code
        return function(*args,**kwargs)
    return inner
@logger
def foo1(x,y=1):
    return x + y

比如这里被logger decorate的函数参数可以是任意的。