zoukankan      html  css  js  c++  java
  • 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






















  • 相关阅读:
    maven 依赖阿里云仓库
    jacob
    mysql
    简单明了区分escape、encodeURI和encodeURIComponent(转载)
    eclipse
    StringBuffer的构造方法和capacity的返回值关系
    toString和valueOf的区别
    js中ajax返回数据
    springmvc 文件上传
    springmvc 上传文件报错 String不能转成multipartFile
  • 原文地址:https://www.cnblogs.com/xiaoAzaina/p/8877433.html
Copyright © 2011-2022 走看看