欢迎访问宙启技术站
智能推送

Python中装饰器的高级用法:给函数添加日志打印功能

发布时间:2023-12-18 02:40:54

装饰器是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

可以看到,在函数执行后,装饰器打印了函数的执行时间。

通过使用带参数的装饰器,我们可以为函数动态地添加各种不同的功能。这大大增加了装饰器的灵活性和可复用性。希望通过这个例子,你可以更好地理解装饰器的高级用法,并在实际开发中充分发挥装饰器的作用。