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

Python函数:装饰器函数和@decorator的用法

发布时间:2023-06-09 13:09:16

Python装饰器(Decorator)是Python语言中进行面向切面编程的一种机制。可以将现有的函数或者类进行装饰,以增加现有函数或者类的功能,而不必对原有的函数或者类进行修改。在Python中,装饰器函数可以使用@decorator的语法进行使用,是一个重要的编程技巧。

装饰器函数

在Python中,装饰器本质上是一个可调用的对象,它将一个函数或者类作为输入参数,并返回一个新的函数或者类对象。

函数装饰器通常定义为一个Python函数,该函数接受一个函数为参数,并返回另一个函数。函数装饰器的一般形式如下:

def decorator(func):
    def wrapper(*args, **kargs):
        # 在调用 func 之前,执行的代码
        result = func(*args, **kargs)
        # 在调用 func 之后,执行的代码
        return result
    return wrapper

其中,decorator就是装饰器函数,func就是需要被装饰的函数。在装饰器函数decorator内部,定义了一个名为wrapper的新函数,该函数可以在调用被装饰的函数之前和之后执行额外的代码,并返回函数的结果。

在调用被装饰的函数之前和之后执行额外的代码往往是装饰器的主要作用。例如,我们可以使用装饰器在函数调用前输出一段信息,如下所示:

def log(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数 {func.__name__} ")
        return func(*args, **kwargs)

    return wrapper

@log
def add(a, b):
    return a + b

print(add(1, 2))

在上面的例子中,使用了一个名为log的装饰器对函数add进行了装饰。装饰器中的wrapper函数在调用函数add之前输出了一段字符串,然后调用实际的add函数,最后返回函数的结果。使用装饰器之后,我们可以看到在调用函数add时会首先输出一行字符串。

装饰器语法

在Python中,我们可以使用装饰器语法@decorator来快速为函数或类进行装饰。使用装饰器语法时,只需要在需要被装饰的函数或类前面添加@decorator即可:


@decorator
def function():
    pass

上面的例子中,装饰器decorator被应用于函数function上,相当于执行了以下语句:


function = decorator(function)

装饰器可以链式使用,例如:

@decorator1
@decorator2
def function():
    pass

上面例子中,function首先会被decorator2装饰,然后再被decorator1装饰。

带参数的装饰器

装饰器也可以带参数,这样就可以实现更加灵活的装饰功能。例如,可以编写一个带参数的装饰器,来指定需要打印的信息:

def log_with_message(message):
    def log_decorator(func):
        def wrapper(*args, **kwargs):
            print(f"{message} {func.__name__}")
            return func(*args, **kwargs)
        return wrapper
    return log_decorator

@log_with_message("调用函数:")
def add(a, b):
    return a + b

print(add(1, 2))

在上面的例子中,我们定义了一个装饰器函数log_with_message,该函数接受一个字符串参数message,然后返回另一个装饰器函数log_decorator。在log_decorator中,我们再次使用嵌套函数的方式定义了函数wrapper。需要注意的是,wrapper函数定义了与上面例子中的wrapper函数略有不同的形参,因为我们需要将被装饰函数的实参直接传递给wrapper函数。

最后,在使用带参数的装饰器时,需要将带参数的装饰器作为函数调用,根据需要提供参数。因为带参数的装饰器在本质上是一个带参数的函数。

总结

本文介绍了Python中装饰器的工作原理和语法。装饰器可以让我们更加便捷地扩展和修改现有的代码,从而实现面向切面编程。无论是使用装饰器函数,还是语法糖,都能轻松地实现装饰器功能。装饰器还可以带参数,从而让我们更加灵活地使用它们。学会装饰器是Python编程的一项重要技能。