Python中装饰器的高级用法:给函数添加日志打印功能
装饰器是Python中强大且灵活的特性之一,在前文中我们已经了解了装饰器的基本概念和用法。在本文中,我将介绍装饰器的高级用法,并给出一个具体的例子:给函数添加日志打印功能。
装饰器的高级用法可以通过使用带参数的装饰器来实现。带参数的装饰器可以接受额外的参数,并在装饰器内部动态地生成另一个装饰器。这样可以根据参数的不同,生成不同的装饰器,从而为函数提供不同的功能。
我们首先定义一个带参数的装饰器log_decorator,该装饰器接受一个字符串参数message,表示要打印的日志信息。装饰器内部定义了一个嵌套的装饰器wrapper,该装饰器接受一个函数作为参数,并在函数执行前后打印日志。
def log_decorator(message):
def wrapper(func):
def inner_wrapper(*args, **kwargs):
print("[LOG] " + message)
result = func(*args, **kwargs)
print("[LOG] " + message)
return result
return inner_wrapper
return wrapper
我们可以通过调用带参数的装饰器来生成具有特定功能的装饰器,然后应用到函数上。例如,我们可以通过调用log_decorator生成一个打印日志的装饰器,并将其应用到一个函数上。
@log_decorator("Executing function foo...")
def foo():
print("Hello, world!")
在上面的例子中,我们使用@log_decorator("Executing function foo...")语法将log_decorator装饰器应用到函数foo上。当调用foo函数时,装饰器会在函数执行前后打印日志信息。
foo()
输出结果为:
[LOG] Executing function foo... Hello, world! [LOG] Executing function foo...
可以看到,在函数foo执行前后,装饰器打印了日志信息。
除了在函数执行前后打印日志信息,我们还可以在装饰器内部添加一些其他的功能。例如,我们可以使用timeit模块来计算函数的执行时间,并打印出来。
import timeit
def log_decorator(func):
def wrapper(*args, **kwargs):
start_time = timeit.default_timer()
result = func(*args, **kwargs)
end_time = timeit.default_timer()
elapsed_time = end_time - start_time
print("[LOG] Function execution time: {} seconds".format(elapsed_time))
return result
return wrapper
通过在装饰器内部定义一个新的嵌套函数wrapper,我们可以在函数执行前后执行额外的代码。在上面的例子中,我们记录了函数执行的起始时间和结束时间,并计算了函数的执行时间。
然后,我们可以将这个装饰器应用到任意的函数上,并观察函数的执行时间。
@log_decorator
def foo():
for i in range(1000000):
pass
foo()
输出结果为:
[LOG] Function execution time: 0.040072065353393555 seconds
可以看到,在函数执行后,装饰器打印了函数的执行时间。
通过使用带参数的装饰器,我们可以为函数动态地添加各种不同的功能。这大大增加了装饰器的灵活性和可复用性。希望通过这个例子,你可以更好地理解装饰器的高级用法,并在实际开发中充分发挥装饰器的作用。
