python装饰器的小细节

以下是我看见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
View Code
原文地址:https://www.cnblogs.com/fuzzier/p/7588975.html