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






















  • 相关阅读:
    17. Letter Combinations of a Phone Number
    16. 3Sum Closest
    15. 3Sum
    14. Longest Common Prefix
    13. Roman to Integer
    12. Integer to Roman
    11. Container With Most Water
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
  • 原文地址:https://www.cnblogs.com/xiaoAzaina/p/8877433.html
Copyright © 2011-2022 走看看