zoukankan      html  css  js  c++  java
  • functools.wraps装饰器的作用

    原文: https://www.dazhuanlan.com/2019/12/26/5e0409c45a205/

    对比测试
    先看一个未使用functools.wraps的装饰器:

    def time_consuming_deco(func):
        """
        计算运行func函数所消耗的时间
        """
        def wrapper(*args, **kwargs):
            start = time.time()*1000
            func(*args, **kwargs)
            end = time.time()*1000  # 转换成毫秒
            print('{0} time consuming: {1} ms'.format(func.__name__, end - start))
        return wrapper
    

    下面使用上面的装饰器:

    @time_consuming_deco
    def f():
        for i in range(1000000):
            pass
    
    f()
    print("f.__name__ :", f.__name__)
    

    运行结果为:

    f time consuming: 22.99853515625 ms
    f.__name__ : wrapper
    

    再看一个使用了functools.wraps的装饰器:

    def time_consuming_deco(func):
        """
        还是上面计算运行func函数所消耗的时间的装饰器,只不过是用使用了functools.wraps
        """
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            start = time.time()*1000
            func(*args, **kwargs)
            end = time.time()*1000  # 转换成毫秒
            print('{0} time consuming: {1} ms'.format(func.__name__, end - start))
        return wrapper
    

    再次运行上面的测试程序结果如下:

    f time consuming: 22.99853515625 ms
    f.__name__ : f
    

    小结
    通过使用functools.wraps可以避免自定义装饰器对所装饰函数造成的函数名影响,防止在后面需要使用函数名的时候造成混乱.

  • 相关阅读:
    Java对象克隆
    Java对象toString()方法
    Java对象相等比较(Equals)
    数据传送到后端(二)
    前端数据传送至后端(一)
    jquery导航栏(方法1)
    js导航栏
    纯css导航栏
    jquery导航栏(方法2)
    带尖角的边框(方法二)
  • 原文地址:https://www.cnblogs.com/marsggbo/p/14814859.html
Copyright © 2011-2022 走看看