Python 向装饰器添加参数

  • Post category:Python

Python中的装饰器是一种优雅的语法,可以用来修改和扩展函数的功能。可以给装饰器添加参数以实现更多的功能。下面是完整的Python向装饰器添加参数的攻略,包含两条示例说明。

基本语法

向装饰器添加参数的基本语法为:

@decorator(argument)
def function():
    pass

其中,decorator是装饰器函数,argument是装饰器函数的参数,function是被装饰的函数。装饰器函数需要返回一个内部函数,内部函数需要接收function作为参数。

示例1:带参数的装饰器

首先,我们定义一个带参数的装饰器:

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

上面的装饰器repeat接收一个参数num,然后返回一个装饰器函数decoratordecorator是一个标准的装饰器函数,接收一个func函数作为参数,然后返回一个内部函数wrapper

这个wrapper函数的作用是将func函数重复num次。它接收任意数量和类型的位置参数和关键字参数(使用*args**kwargs),在循环中调用func函数,并返回其结果。

现在,我们可以使用repeat装饰器来修饰任何函数,并指定num参数:

@repeat(num=3)
def hello():
    print('Hello, world!')

hello()

输出:

Hello, world!
Hello, world!
Hello, world!

在这个示例中,我们使用了@repeat(num=3)语法将hello函数传递给装饰器函数repeat。由于我们指定了num=3参数,hello函数被重复调用了三次。

示例2:带参数和返回值的装饰器

下面,我们定义一个带参数和返回值的装饰器:

def prefix(prefix_str):
    def decorator(func):
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            return prefix_str + result
        return wrapper
    return decorator

上面的装饰器prefix接收一个参数prefix_str,然后返回一个装饰器函数decoratordecorator是一个标准的装饰器函数,接收一个func函数作为参数,然后返回一个内部函数wrapper

这个wrapper函数的作用是在调用func函数之前添加前缀字符串prefix_str,然后返回调用结果。它接收任意数量和类型的位置参数和关键字参数(使用*args**kwargs),在调用func函数之前添加前缀字符串prefix_str,然后返回调用结果。

现在,我们可以使用prefix装饰器来修饰任何函数,并指定prefix_str参数:

@prefix(prefix_str='[INFO] ')
def say(something):
    return something

print(say('hello, world!'))

输出:

[INFO] hello, world!

在这个示例中,我们使用了@prefix(prefix_str='[INFO] ')语法将say函数传递给装饰器函数prefix。由于我们指定了prefix_str='[INFO] '参数,say函数被添加了前缀字符串[INFO]

总结

通过向装饰器添加参数,我们可以扩展装饰器的功能,并实现更多的应用场景。Python的装饰器功能强大,是实现元编程的重要技术之一。