下面是对于Python中的装饰器使用的具体讲解。
什么是装饰器
在Python中,装饰器是一种特殊的函数,它可以在不改变原函数代码的情况下,为函数增加新的功能。我们可以使用装饰器来实现函数的日志记录,性能分析,缓存等等。
在Python中,装饰器是通过 @ 符号来使用的,一般放在被装饰函数之前。
装饰器使用
我们可以使用装饰器来给一个函数添加功能。接下来通过两个示例来说明装饰器的使用。
示例1:函数计时
我们来编写一个装饰器,用于计算一个函数的执行时间。
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 执行时间为: {(end_time - start_time): .6f} s")
return result
return wrapper
这个装饰器的原理是:被装饰的函数将作为参数传入到timer函数中,timer函数返回的是一个新的函数wrapper,这里wrapper函数中会先记录下函数开始执行的时间,然后再调用原函数,最后得到函数的结果并记录下结束时间。执行完原函数后再输出函数执行时间。这样我们就可以很方便的对函数进行计时了。
接下来我们来测试一下计时装饰器的使用:
@timer
def test_time_sleep():
time.sleep(1)
if __name__ == "__main__":
test_time_sleep()
这里我们定义了一个test_time_sleep函数,使用@timer装饰器来给test_time_sleep函数添加计时的功能。执行结果如下:
函数 test_time_sleep 执行时间为: 1.004460 s
可以看到, 函数执行时长为1秒,非常满足我们的需求。
示例2:缓存函数的结果
装饰器还可以用来给函数添加缓存功能,用于缓存函数执行的结果,避免重复的计算。
这里我们编写一个装饰器,用来给函数添加缓存功能:
def memoize(func):
cache = {}
def wrapper(*args):
if args in cache:
return cache[args]
result = func(*args)
cache[args] = result
return result
return wrapper
上面的代码中,memoize函数返回的是一个新的函数wrapper,wrapper函数中使用了一个字典cache,这个字典中存放着缓存的结果,当函数被调用时,先判断参数是否已经存在在cache字典中,如果存在直接返回缓存的结果,否则执行函数并把结果缓存起来。
我们来测试一下缓存装饰器的使用:
@memoize
def fibonacci(n):
if n == 0 or n == 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
这里我们定义了一个fibonacci函数,使用@memoize装饰器来给函数添加缓存功能。因为斐波那契数列计算较为耗时,使用缓存可以避免重复计算。执行结果如下:
print(fibonacci(20)) # 执行时间较长
print(fibonacci(20)) # 不需要重新计算,直接输出结果
第一次执行需要较长时间才能输出结果,但是第二次执行就不需要重新计算,直接输出结果。这样我们就成功使用了装饰器来实现缓存计算结果的功能。
结语
这就是Python中装饰器的使用完整攻略。装饰器为我们提供了一种非常方便的扩展函数功能的方式,我们可以使用它来实现非常多的功能,使我们的代码更简洁、更易读。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中的装饰器使用 - Python技术站