Python装饰器是一种强大的工具,它允许我们在不修改原函数代码的情况下,增加函数的功能。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。在Python中,装饰器使用@符号来标识。
让我们从一个简单的例子开始。假设我们有一个打印问候语的函数:
def greet():
print("Hello, world!")
现在,我们想要在每次调用这个函数时,都记录一下日志。我们可以定义一个装饰器来实现这个功能:
def log_decorator(func):
def wrapper():
print("Log: Function is called.")
func()
return wrapper
然后,我们可以使用@符号将这个装饰器应用到greet函数上:
greet = log_decorator(greet)
现在,每次我们调用greet函数时,都会先打印出日志信息,然后再执行原来的greet函数。
装饰器的魔力在于它的灵活性。我们可以定义各种各样的装饰器,来增强我们的函数。例如,我们可以定义一个计时装饰器,来计算函数的运行时间:
import time
def timing_decorator(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print("Time taken: ", end_time - start_time)
return wrapper
同样,我们可以使用@符号将这个装饰器应用到我们的函数上。
装饰器还可以接受参数,这使得它们更加灵活。例如,我们可以定义一个接受一个字符串参数的装饰器,这个字符串将被添加到我们的日志信息中:
def log_decorator_with_param(log_message):
def real_decorator(func):
def wrapper():
print(log_message)
func()
return wrapper
return real_decorator
我们可以像下面这样使用这个装饰器:
greet = log_decorator_with_param("Log: Greet function is called.")(greet)
以上就是Python装饰器的基本概念和用法。装饰器是一个非常强大的工具,它可以帮助我们写出更加清晰、更加模块化的代码。