如何在Python中定义和使用装饰器函数?
装饰器(Decorator)是Python中一种特殊的函数,用于修改或增强其他函数的功能。装饰器可以在不修改原函数代码的前提下,增加新的功能或行为,例如:日志记录、性能计时、输入参数检查、缓存等。在Python中,装饰器是一种高阶函数(Higher-order function),它接收一个函数作为参数,并返回一个新的函数。
在Python中,装饰器可以使用@语法糖来调用。例如:
@decorator_function
def my_function():
# function body
其中,decorator_function就是装饰器函数的名称,my_function是需要被装饰的函数名。装饰器会把my_function作为参数传递给decorator_function,并返回一个新的函数。这个新的函数就是经过装饰之后的my_function,它具有了原函数的功能和额外的特性。
下面是一个简单的装饰器示例,用于记录函数执行时间:
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__} takes {end_time - start_time:.2f} seconds to run")
return result
return wrapper
@timer
def my_function():
# function body
在上面的代码中,timer是装饰器函数,它接收一个函数作为参数,并返回一个新的函数wrapper。wrapper函数用于记录被装饰函数的执行时间,并在函数执行完毕后打印执行时间。通过在my_function前添加@timer,即可将my_function装饰器装饰,并在函数执行时记录执行时间。
除了使用@语法糖外,还可以通过以下方式来调用装饰器:
def my_function():
# function body
decorated_function = timer(my_function)
在上面的代码中,将my_function作为参数传递给timer函数,返回一个新的decorated_function。这个decorated_function就是经过装饰后的函数,它具有了原函数的功能和装饰器的特性。
装饰器也可以使用多个,它们可以可以嵌套使用。例如,下面的示例演示了如何通过两个装饰器修饰函数:
def logger(func):
def wrapper(*args, **kwargs):
print('Logging:', func.__name__)
return func(*args, **kwargs)
return wrapper
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} takes {end_time - start_time:.2f} seconds to run")
return result
return wrapper
@logger
@timer
def my_function():
# function body
在上面的代码中,使用@timer和@logger两个装饰器修饰my_function函数,它们的执行顺序是从上到下。也就是说,先执行@timer装饰器,再执行@logger装饰器。
总结来说,装饰器是Python中一种很方便的语法糖,它可以在不修改原函数代码的前提下,增加新的功能或行为。通过@语法糖或函数调用的方式,可以轻松地将装饰器应用到函数上,实现装饰器的功能。
