以下是我看见python装饰器的一些我不熟悉的特点,所以记录一下
1 装饰器的特性:
1.1 可以吧被装饰的函数替换成不同的函数 decorate(func)。
1.2 加载模块时候立即执行。这点很有用
这里我们可以给出最简单的装饰器
def decorate(func): print 'im a func' return func @decorate def foo(s): return 'the name is me %s' % s #启动程序 [out] im a func
2 闭包的特点:
2.1 inner 能访问 outer 及其祖先函数的命名空间内的变量(局部变量、函数参数)
2.2 调用 outer 已经返回了,但是他的命名空间被返回的 inner 对象引用,所以不会被回收
3 functool.wraps(func):
总结起来就是保存了func的 __name__, __doc__ 等信息,例如:
# -*- coding: utf-8 -*- import functools def wrap1(func): @functools.wraps(func) def inner(): print 'wrap1' return func() return inner def wrap2(func): def inner(): print 'wrap2' return func() return inner @wrap1 def func1(): print 'func1' return @wrap2 def func2(): print 'func2' return if __name__ == '__main__': print 'have wrap: ' + func1.__name__ print 'have not wrap: ' + func2.__name__ [output:] have wrap: func1 have not wrap: inner