引言
在Python中,装饰器是一种强大的工具,可以修改已有的函数或者类的行为,而又不需要修改它们的源代码。使用装饰器可以在不改变函数结构的情况下,添加额外的功能或者修饰函数的行为。本篇博客将介绍Python中的装饰器和函数修饰器,并讨论它们的具体应用场景和实践。
装饰器的基本概念
装饰器是Python中比较常用的一种设计模式。它实际上是一个用来增强函数功能的函数,它接受一个函数作为参数并返回一个新的函数,该新函数在原函数的基础上添加了额外的功能。
装饰器可以用于函数、类甚至是方法。装饰器的语法由@符号和装饰器函数组成,它放置在被修饰函数或类的定义之前。
函数修饰器实践
1. 添加日志功能
一个常用的应用场景是为函数添加日志功能,在函数被调用时输出函数的名称和参数信息。下面是一个示例:
def logger(func):
def wrapper(*args, **kwargs):
print(f'Calling function {func.__name__} with args {args} {kwargs}')
return func(*args, **kwargs)
return wrapper
@logger
def add(a, b):
return a + b
print(add(2, 3))
输出结果为:
Calling function add with args (2, 3) {}
5
2. 计时功能
另一个常用场景是为函数添加计时功能,以记录函数的执行时间。下面是一个示例:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
execution_time = end_time - start_time
print(f'Function {func.__name__} executed in {execution_time} seconds.')
return result
return wrapper
@timer
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10))
输出结果为:
Function fibonacci executed in 0.015180826187133789 seconds.
55
3. 缓存功能
在某些情况下,我们希望在函数被多次调用时,将计算结果缓存起来,以减少重复计算的开销。下面是一个示例:
def cache(func):
memo = {}
def wrapper(*args):
if args in memo:
return memo[args]
else:
result = func(*args)
memo[args] = result
return result
return wrapper
@cache
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10))
print(fibonacci(10))
输出结果为:
55
55
总结
本篇博客介绍了Python中的装饰器和函数修饰器的基本概念,并通过实践演示了几个常见的装饰器应用场景。装饰器是Python中非常强大且常用的工具,可以为函数添加额外的功能,如日志、计时、缓存等。通过使用装饰器,我们可以在不改变函数结构的情况下,方便地为函数添加各种功能和修饰行为。

评论 (0)