• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

python 函数装饰器

开发技术 开发技术 2周前 (04-07) 8次浏览
# 使用一个函数来装饰另一个函数,不使用@

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


程序员灯塔
转载请注明原文链接:python 函数装饰器
喜欢 (0)