Python装饰器是一种高级Python特性,它允许我们在不修改原始函数代码的情况下,增加函数的功能。装饰器本质上是一个接受函数作为参数的函数,它可以在不改变函数源代码的情况下,增加函数的功能。
装饰器的工作原理是通过一个特殊的语法糖“@”,它可以将一个函数作为参数传递给装饰器函数。装饰器函数通常会定义一个新的函数,这个新函数会在原函数的基础上增加一些新的功能,然后返回这个新函数。当调用被装饰的函数时,实际上调用的是装饰器返回的新函数。
让我们通过一个简单的例子来理解装饰器的工作原理。假设我们有一个函数greet
,它接受一个名字作为参数,并打印一条问候消息:
def greet(name):
print(f"Hello, {name}!")
现在,我们想要在每次调用greet
函数时,都自动打印出当前的日期和时间。我们可以使用装饰器来实现这个功能,而不需要修改greet
函数的源代码。
首先,我们定义一个装饰器函数log_time
,它接受一个函数作为参数,并返回一个新的函数。新函数会在调用原函数之前,打印当前的日期和时间:
import datetime
def log_time(func):
def wrapper(*args, **kwargs):
print(datetime.datetime.now())
return func(*args, **kwargs)
return wrapper
然后,我们使用@
语法糖,将greet
函数作为参数传递给log_time
装饰器:
@log_time
def greet(name):
print(f"Hello, {name}!")
现在,每当我们调用greet
函数时,都会自动打印出当前的日期和时间:
greet("Alice")
输出:
2022-01-01 00:00:00
Hello, Alice!
这就是装饰器的工作原理。通过装饰器,我们可以在不修改原函数代码的情况下,增加函数的功能。这使得我们的代码更加灵活和可重用。