对于装饰器Decorator的理解

装饰器是用来描述函数,记录日志,提供信息的函数,是一个为了更好的服务主函数的副函数:

 详情还需查看:廖雪峰装饰器

关键在于:【import functools是导入functools模块。模块的概念稍候讲解。现在,只需记住在定义wrapper()的前面加上@functools.wraps(func)即可。】

下面是对两道对应练习题的个人代码编写即记录:

练习题1:请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:(事件函数目前没掌握,但是不影响对装饰器的理解)

import time, functools
def metric(fn):         # 这是decorator函数的定义,没有过多要传递的信息,两层嵌套嵌套即可
    @functools.wraps(fn)
    def wrapper(*args, **kw):
        print('%s executed in %s ms' % (fn.__name__, '10.24'))
        return fn(*args, **kw)
    return wrapper

@metric                 #这是在定义主函数时调用decorator函数的方法
def fast(x, y):
    time.sleep(0.0012)
    return x + y

@metric
def slow(x, y, z):
    time.sleep(0.1234)
    return x * y * z

f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
    print('测试失败!')
elif s != 7986:
    print('测试失败!')

练习题2:请编写一个decorator,能在函数调用的前后打印出'begin call''end call'的日志:

import functools
def metric(text1,text2):   # 这里不允许写要服务的函数名
    def decorate(fn):      # 要服务的函数名这里写
        @functools.wraps(fn)
        def wrapper(*args, **kw):
            print('%s %s:' % (text1, fn.__name__))
            fn(*args, **kw)
            print('%s %s.' % (text2, fn.__name__))
        return wrapper
    return decorate

@ metric('begin call','end call')  # r如果在调用装饰器时要个性化传递参数,装饰器函数需要3层嵌套;注意这里不能再写good,已经@了。
def good(x,y):
    print(x+y)
good(2,3)
原文地址:https://www.cnblogs.com/Jie-Bian/p/11047401.html