📜  Python中带参数的装饰器(1)

📅  最后修改于: 2023-12-03 15:34:21.828000             🧑  作者: Mango

Python中带参数的装饰器

装饰器(decorators)是Python中非常有用的一个特性,它是一种在不需要修改函数代码的情况下,将函数功能进行拓展的方式。在Python中,装饰器本质上是一个Python函数或类,它可以用来包装其他函数或类,从而拓展它们的功能。

在Python中,我们可以使用“@”符号来应用装饰器。通过在函数定义之前加上“@decorator_name”,我们就可以把装饰器应用到函数上。例如:

@my_decorator
def my_function():
    print("hello world")

这段代码中,我们定义了一个名为my_decorator的装饰器,并将其应用到函数my_function上。在my_function被调用时,实际上是先执行了my_decorator(my_function),然后将其返回值作为新的my_function

但是,如果我们想让我们的装饰器能够接受参数,该怎么办呢?答案是:定义一个带参数的装饰器。

以下是一个使用带参数的装饰器的例子:

def repeat(num):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for i in range(num):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator_repeat

@repeat(num=3)
def greet(name):
    print(f"Hello, {name}")

greet("John")

这段代码中,我们定义了一个名为repeat的装饰器,并将其应用到函数greet上。我们在repeat中定义了一个内部函数decorator_repeat,该函数接受一个函数作为参数,并返回一个新的函数wrapperwrapper函数接受任意数量的位置参数和关键字参数,并将函数func重复执行num次。

使用带参数的装饰器时,我们需要在装饰器名后面加上括号,并将参数传递给它。例如,在上述代码中,我们使用了@repeat(num=3),将参数num设置为3。

输出结果为:

Hello, John
Hello, John
Hello, John

这段代码中的带参数的装饰器让我们的greet函数重复执行了3次。我们可以根据需要调整repeat装饰器中的参数,以实现所需的功能。

总之,Python中的装饰器是一个非常有用的特性,它可以在不修改函数代码的情况下,对函数进行拓展。而带参数的装饰器则可以让我们更灵活地定义装饰器的行为,以适应不同的使用场景。