python 函数装饰器

# 使用一个函数来装饰另一个函数,不使用@

def a_new_decorator(a_func):

    def wrapTheFunc():
        print("Do sth. before a_func()")

        a_func()

        print("Do sth. after a_func()")

    return wrapTheFunc


def a_func_requiring_decoration():
    print("I need some decoration")

a_func_requiring_decoration = a_new_decorator(a_func_requiring_decoration)

a_func_requiring_decoration()
# 输出如下:
# Do sth. before a_func()
# I need some decoration
# Do sth. after a_func()

 

# 使用@来运行上面的代码

def a_new_decorator(a_func):

    def wrapTheFunc():
        print("Do sth. before a_func()")

        a_func()

        print("Do sth. after a_func()")

    return wrapTheFunc

@a_new_decorator
def a_func_requiring_decoration():
    print("I need some decoration")

# a_func_requiring_decoration = a_new_decorator(a_func_requiring_decoration)

a_func_requiring_decoration()

 

the @a_new_decorator is a just a short way of saying:
a_func_requiring_decoration = a_new_decorator(a_func_requiring_decoration)

 

 

# 希望print(xx.__name__)的结果是xx,而不是wrapTheFunc
# 使用functools.wraps来解决此问题

from functools import wraps


def a_new_decorator(a_func):
    @wraps(a_func)
    def wrapTheFunc():
        print("Do sth. before a_func()")

        a_func()

        print("Do sth. after a_func()")

    return wrapTheFunc

@a_new_decorator
def a_func_requiring_decoration():
    print("I need some decoration")

# a_func_requiring_decoration = a_new_decorator(a_func_requiring_decoration)

a_func_requiring_decoration()

print(a_func_requiring_decoration.__name__)

注意:@wraps接受一个函数来进行装饰,并加入了复制函数名称、注释文档、参数列表等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性。

posted on 2021-04-07 11:15  Karlkiller  阅读(51)  评论(0编辑  收藏  举报

导航