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

Python中使用decorator装饰器增强函数

发布时间:2023-11-22 04:52:19

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,它返回一个装饰器decoratordecorator的内部定义了一个新函数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

我们可以看到,在函数执行后,装饰器计算出了函数的执行时间并打印出来。

通过上述示例,我们可以看到,装饰器可以方便地增强函数的功能,实现一些通用的功能模块,并且使代码更加简洁易读。在实际应用中,我们可以根据需要定义各种类型的装饰器,并将其应用到不同的函数上,以实现不同的功能增强需求。