[root@iZj6chejzrsqpclb7miryaZ ~]# python t.py 
module: __main__, name: func, doc: this is func.
module: __main__, name: _inner, doc: this is _inner.
module: __main__, name: func, doc: this is func.
[root@iZj6chejzrsqpclb7miryaZ ~]# cat t.py 
# coding: utf8

import functools

def deco(f):
    def _inner(*a, **kw):
        """this is _inner"""
        print "before invoke"
        try:
            return f(*a, **kw)
        finally:
            print "after invoke"
    return _inner

def func():
    """this is func"""
    print "func"
print "module: %s, name: %s, doc: %s." \
    % (func.__module__, func.__name__, func.__doc__)

# 使用了装饰器之后,__module__,__name__,__doc__
# + 变成了被装饰器返回的函数的了
@deco
def func():
    """this is func"""
    print "func"
print "module: %s, name: %s, doc: %s." \
    % (func.__module__, func.__name__, func.__doc__)


# 使用functools.wraps(fn)可以将被其装饰的函数的
# + __module__,__name__,__doc__设置为fn的
def deco(f):
    @functools.wraps(f)
    def _inner(*a, **kw):
        """this is _inner"""
        print "before invoke"
        try:
            return f(*a, **kw)
        finally:
            print "after invoke"
    return _inner
@deco
def func():
    """this is func"""
    print "func"
print "module: %s, name: %s, doc: %s." \
    % (func.__module__, func.__name__, func.__doc__)