Python中使用decorator装饰器增强函数
Python中的装饰器(decorator)是一种用于增强函数功能的语法糖。装饰器可以在不改变原函数定义的情况下,为函数添加额外的功能,比如日志记录、输入参数验证、性能统计等。本文将介绍Python中使用装饰器增强函数的方法。
装饰器是一个以被装饰函数为参数并返回新函数的函数。装饰器可以使用@符号来应用到其他函数上。下面是一个简单的装饰器示例:
def decorator(func):
def wrapper(*args, **kwargs):
# 装饰器增加的功能
print("Before function execution")
result = func(*args, **kwargs)
print("After function execution")
return result
return wrapper
@decorator
def my_function():
print("My function")
my_function()
在上面的例子中,我们定义了一个装饰器decorator,它接收一个函数作为参数func。装饰器decorator内部定义了一个新函数wrapper,该函数在被装饰函数执行之前和之后打印一些信息。然后,我们使用@decorator语法将装饰器应用到my_function函数上。当我们调用my_function时,实际上是调用了装饰器所返回的wrapper函数。
运行上述代码,输出结果如下:
Before function execution My function After function execution
我们可以看到,在调用my_function前后,装饰器增加的功能被执行了。
除了上面的示例,我们还可以使用带有参数的装饰器。在下面的示例中,我们定义了一个带有参数的装饰器logger,用于在函数执行前后记录日志:
def logger(log_level):
def decorator(func):
def wrapper(*args, **kwargs):
# 装饰器增加的功能
print(f"[{log_level}] Before function execution")
result = func(*args, **kwargs)
print(f"[{log_level}] After function execution")
return result
return wrapper
return decorator
@logger(log_level="INFO")
def my_function():
print("My function")
my_function()
在上述示例中,我们定义了一个带有参数log_level的装饰器logger,它返回一个装饰器decorator,decorator的内部定义了一个新函数wrapper,在被装饰函数执行之前和之后打印日志,日志级别由参数log_level确定。我们使用@logger(log_level="INFO")语法将装饰器应用到my_function函数上。
运行上述代码,输出结果如下:
[INFO] Before function execution My function [INFO] After function execution
我们可以看到,在调用my_function前后,根据装饰器参数log_level确定的日志级别打印了相应的日志。
除了上述示例外,我们还可以使用类作为装饰器。在下面的示例中,我们定义了一个类Timer,用于计算函数的执行时间:
import time
class Timer:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
start_time = time.time()
result = self.func(*args, **kwargs)
end_time = time.time()
execution_time = end_time - start_time
print(f"Execution time: {execution_time} seconds")
return result
@Timer
def my_function():
time.sleep(2)
print("My function")
my_function()
在上述示例中,我们定义了一个类Timer,它接收一个函数作为参数。类的__call__方法定义了实例对象被调用时的行为。在__call__方法中,我们记录了函数执行前后的时间,并计算出执行时间。然后,我们使用@Timer语法将类Timer作为装饰器应用到my_function函数上。
运行上述代码,输出结果如下:
My function Execution time: 2.000601053237915 seconds
我们可以看到,在函数执行后,装饰器计算出了函数的执行时间并打印出来。
通过上述示例,我们可以看到,装饰器可以方便地增强函数的功能,实现一些通用的功能模块,并且使代码更加简洁易读。在实际应用中,我们可以根据需要定义各种类型的装饰器,并将其应用到不同的函数上,以实现不同的功能增强需求。
