zoukankan      html  css  js  c++  java
  • 对于装饰器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)
  • 相关阅读:
    第三次作业-有进度条圆周率计算
    第一周作业
    24点
    Cuber Sorting
    P1827 [USACO3.4]美国血统 American Heritage
    P4387 【深基15.习9】验证栈序列
    P2058 海港
    P4017 最大食物链计数
    P2196 挖地雷
    放苹果问题
  • 原文地址:https://www.cnblogs.com/Jie-Bian/p/11047401.html
Copyright © 2011-2022 走看看