<返回更多

Python中的函数装饰器

2021-08-31    小啊熊
加入收藏

写一个简单的无参装饰器,计算math_info所需要的时间

# 1, 基础函数,计算出2的16次方的值
def math_info():
    print("2**16的结果是:",2**64)
# 2, 计算wrApper所需要的时间
import time
def wrapper(func):
    start_time=time.time()
    res = math_info()
    print("用时: ",float(time.time() - start_time))
    return res

wrapper(math_info)

2**64的结果是: 18446744073709551616
用时:  0.004000186920166016

步骤2改变了原函数的调用方式,所以不能使用(违反了开放封闭原则)

# 3, 换一种为函数体传值的方式,即将值包给函数
def timer(func):
    def wrapper(): # 引用外部作用域的变量func
        start_time=time.time()
        res=func()
        stop_time=time.time()
        print("用时: ",float(time.time() - start_time))
        return res
    return wrapper

# 得到math_info=wrapper,wrapper携带对外作用域的引用:func=原始的math_info
math_info=timer(math_info)  
# 执行的是wrapper(),在wrapper的函数体内再执行最原始的math_info
math_info() 

步骤3写法我们不推荐,因为代码量变多了,最主要的是Python/ target=_blank class=infotextkey>Python为我们提供了一个语法糖,我们可以使用语法糖更简便的写出同样的功能

# 完整的无参装饰器
import time
def timer(func):
    def wrapper(): # 引用外部作用域的变量func
        start_time=time.time()
        res=func()
        stop_time=time.time()
        print("用时: ",float(time.time() - start_time))
        return res
    return wrapper


@timer  # @timer就相当于math_info=timer(math_info)
def math_info():
    time.sleep(2)
    print("2**64的结果是:",2**64)

math_info()

2**64的结果是: 18446744073709551616
用时:  2.004000186920166016

其实只要记住,装饰器的目的是在不改变原函数代码及调用方法的前提下添加新的功能

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>