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
,然后返回一个装饰器函数decorator
,decorator
是一个标准的装饰器函数,接收一个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
,然后返回一个装饰器函数decorator
,decorator
是一个标准的装饰器函数,接收一个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的装饰器功能强大,是实现元编程的重要技术之一。