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






















  • 相关阅读:
    在二元树中查找和为某一值的所有路径
    求整数的二进制表示1的个数
    Javascript AJAX 解析XML 兼容FIREFOX/IE
    DOM解析XML笔记
    Linux c 共享内存
    C Socket 发送/接收数据结构
    Linux c 获取系统内存
    7.5备忘
    linux c 唤醒进程 获取子进程结束状态
    7.1-7.2备忘
  • 原文地址:https://www.cnblogs.com/xiaoAzaina/p/8877433.html
Copyright © 2011-2022 走看看