• Python之装饰器


    装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

    装饰器的作用:在不改变原函数及原函数的执行的情况下,为原函数增加一些额外的功能,比如打印日志、执行时间,登录认证等等。

    测试函数的执行时间:

    一个简单的装饰器:

    import time

    def func1():
    print('晚上回家吃饭!')
    time.sleep(1)
    def func2():
    print("晚上不回家吃饭!")
    time.sleep(1)
    def timer(f1):
    star_time = time.time()
    f1()
    end_time = time.time()
    print('耗时:%s'%(end_time-star_time))

    f = func1
    func1 = timer
    func1(f)

    import time

    def func1():
    print('晚上回家吃饭!')
    time.sleep(1)
    def func2():
    print("晚上不回家吃饭!")
    time.sleep(1)
    def timer(f1): # f1 = func1
      def inner():
        star_time = time.time()
        f1()
      end_time = time.time()
        print('耗时:%s'%(end_time-star_time))
      return inner
    func1 = timer(func1) #实际返回inner
    func1() #相当于执行inner()

    但是如果有多个函数,我都想让你测试他们的执行时间,你每次是不是都得func1 = timer(func1)?这样还是有点麻烦,
    因为这些函数的函数名可能是不相同,有func1,func2,graph,等等,所以更简单的方法,python给你提供了,那就是语法糖。
    import time

    def timer(f1): 
      def inner():
        star_time = time.time()
        f1()
      end_time = time.time()
        print('耗时:%s'%(end_time-star_time))
      return inner
    @timer #相当于 func1 = timer(func1) 返回inner
    def func1():
    print('晚上回家吃饭!')
    time.sleep(1)
    func1()


    带参数的装饰器:
    import time

    def timer(f1): #f1 = func1
    def inner(*args,**kwargs):
    star_time = time.time()
    f1(*args,**kwargs)
    end_time = time.time()
    print('耗时:%s'%(end_time-star_time))
    return inner
    @timer #相当于 func1 = timer(func1) 返回inner
    def func1(a,b):
    print(a,b)
    print('晚上回家吃das 饭!')
    time.sleep(1)
    func1(11,22) #相当于执行inner(11,22)
    带返回值的装饰器
    import time

    def timer(f1):
    def inner(*args,**kwargs):
    star_time = time.time()
    '''上面的代码是执行函数之前的操作'''
    ret = f1(*args,**kwargs)
    '''下面的部分是执行函数之后的操作'''
    end_time = time.time()
    print('耗时:%s'%(end_time-star_time))
    return ret
    return inner
    @timer #相当于 func1 = timer(func1) 返回inner
    def func1(a,b):
    print(a,b)
    print('晚上回家吃das 饭!')
    time.sleep(1)
    return 666
    print(func1(11,22)) #相当于执行inner(11,22)
    执行结果

      11 22
      晚上回家吃das 饭!
      耗时:1.0000572204589844
      666






















  • 相关阅读:
    字符转换(2,8,10,16进制,ASCII码)
    js正则表达式验证
    不能在DropDownList 中选择多个项
    SQL中sum(),avg()等统计结果为null的解决方法
    文本框TextBox只允许输入数字,不用onkeyup
    ORA01830: 日期格式图片在转换整个输入字符串之前结束
    Oracle数据库中的左连接与右连接
    asp.net服务器验证控件失效的问题
    在博客园开通博客的第一天
    米勒拉宾素数测试
  • 原文地址:https://www.cnblogs.com/xiaoAzaina/p/8877433.html
Copyright © 2020-2023  润新知