写一个装饰器,效果是将所有使用这个装饰器的函数名加到一个list中。标注释和验证方法
时间: 2024-02-15 11:04:12 浏览: 21
好的,这里是装饰器的实现:
```python
def collect_function_names(func):
function_names = []
def wrapper(*args, **kwargs):
function_names.append(func.__name__)
return func(*args, **kwargs)
wrapper.function_names = function_names
return wrapper
```
这个装饰器会将所有使用它的函数名加到一个列表中。在装饰器内部定义了一个 `function_names` 列表,然后定义了一个 `wrapper` 函数,用来包装被装饰的函数。在 `wrapper` 函数中,我们将被装饰的函数名添加到 `function_names` 列表中,然后再调用被装饰的函数,并将结果返回。最后,我们将 `function_names` 列表赋值给 `wrapper` 函数的 `function_names` 属性,这样就可以在外部访问到这个列表了。
下面是使用这个装饰器的例子:
```python
@collect_function_names
def func1():
pass
@collect_function_names
def func2():
pass
print(func1.function_names) # 输出 ['func1', 'func2']
print(func2.function_names) # 输出 ['func1', 'func2']
```
我们定义了两个函数 `func1` 和 `func2`,并在它们的定义上使用了 `@collect_function_names` 装饰器。然后我们分别打印了这两个函数的 `function_names` 属性,可以看到它们的值都是 `['func1', 'func2']`,也就是说这个装饰器成功地将这两个函数的名字加到了列表中。