Python装饰器是高级Python编程中的一个有趣概念,它允许我们在不改变函数源代码的情况下增加额外的功能。装饰器本质上是一个接受函数作为参数并返回一个新函数的高阶函数。通过这种方式,我们可以“装饰”我们的函数,使其在执行主要任务之前或之后执行额外的操作。
让我们从一个基本的例子开始,创建一个记录函数调用日志的装饰器:
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Calling function: {func.__name__}")
result = func(*args, **kwargs)
print(f"{func.__name__} executed successfully.")
return result
return wrapper
在这个例子中,log_decorator
是一个装饰器函数,它接收一个函数func
作为参数。内部函数wrapper
包装了原始函数,增加了打印调用信息的功能,然后调用原始函数并返回结果。
现在,如果我们有一个函数add
,我们可以使用@log_decorator
来装饰它:
@log_decorator
def add(a, b):
return a + b
每次调用add
函数时,都会首先打印出调用信息,然后再执行函数体,最后打印执行成功的信息。
除了简单的装饰器之外,Python还支持带参数的装饰器。这允许我们为装饰器本身添加配置选项。例如,我们可以为上面的日志装饰器添加一个可选的消息前缀:
def log_decorator(prefix=''):
def real_decorator(func):
def wrapper(*args, **kwargs):
print(f"{prefix}Calling function: {func.__name__}")
result = func(*args, **kwargs)
print(f"{prefix}{func.__name__} executed successfully.")
return result
return wrapper
return real_decorator
现在,我们可以为不同的函数指定不同的前缀:
@log_decorator("[INFO] ")
def add(a, b):
return a + b
这将在每次调用add
函数时打印带有“[INFO] ”前缀的日志消息。
通过这些示例,我们可以看到装饰器如何为函数添加附加行为而无需修改其代码。在实际应用中,装饰器可以用于日志记录、性能测试、权限检查等多种场景。
总结来说,Python装饰器提供了一种灵活且强大的方式来扩展函数的功能。通过理解装饰器的工作原理和正确使用它们,我们可以编写更加清晰、高效和可维护的代码。随着对装饰器理解的加深,你会发现它们在解决日常编程问题中的巨大潜力。