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)
  • 相关阅读:
    asp.net 生成静态页
    修改数据库字段以及字段类型
    int ,int?,int??
    ASP.NET JS常用方法类
    遍历repeater中的控件的几种方式
    .net获取ip地址
    asp.net中DataList和Repeater的使用
    Web.config中注册用户控件和自定义控件
    dos 必知八项命令
    ASP.NET配置文件Web.config
  • 原文地址:https://www.cnblogs.com/Jie-Bian/p/11047401.html
Copyright © 2011-2022 走看看