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)
  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/Jie-Bian/p/11047401.html
Copyright © 2011-2022 走看看