python装饰器如何传入参数
时间: 2023-11-07 07:50:05 浏览: 40
Python 装饰器可以接受参数的方式有两种:使用函数装饰器和使用类装饰器。
1. 使用函数装饰器传递参数:
在装饰器函数内部,可以定义一个接受参数的包装函数,并在包装函数内部再定义一个装饰器函数。这样,我们就可以在调用装饰器时传递参数,并将参数传递给包装函数。
示例代码如下:
```python
def decorator_with_arguments(arg1, arg2):
def decorator_function(func):
def wrapper(*args, **kwargs):
# 在调用被装饰函数前进行的操作
print(f"Decorator arguments: {arg1}, {arg2}")
result = func(*args, **kwargs)
# 在调用被装饰函数后进行的操作
return result
return wrapper
return decorator_function
@decorator_with_arguments("arg1_value", "arg2_value")
def my_function():
print("Hello, world!")
my_function()
```
在上面的例子中,`decorator_with_arguments` 函数接受两个参数 `arg1` 和 `arg2`。它返回一个装饰器函数 `decorator_function`,该装饰器函数接受被装饰的函数 `func` 作为参数,并返回一个新的函数 `wrapper`。在 `wrapper` 函数中,我们可以使用传递给装饰器的参数 `arg1` 和 `arg2`。
2. 使用类装饰器传递参数:
使用类装饰器时,我们可以将装饰器实现为一个类,并在类的初始化方法中接受参数。然后,我们可以在类中定义 `__call__` 方法,该方法会在装饰器被调用时执行。
示例代码如下:
```python
class DecoratorWithArguments:
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def __call__(self, func):
def wrapper(*args, **kwargs):
# 在调用被装饰函数前进行的操作
print(f"Decorator arguments: {self.arg1}, {self.arg2}")
result = func(*args, **kwargs)
# 在调用被装饰函数后进行的操作
return result
return wrapper
@DecoratorWithArguments("arg1_value", "arg2_value")
def my_function():
print("Hello, world!")
my_function()
```
在上面的例子中,`DecoratorWithArguments` 类接受两个参数 `arg1` 和 `arg2`。它定义了 `__call__` 方法,在装饰器被调用时会执行这个方法。在 `__call__` 方法中,我们可以使用类的属性 `self.arg1` 和 `self.arg2`。
以上是两种常见的装饰器传递参数的方式。根据实际需求,你可以选择适合的方式来传递参数给装饰器。