Python 中装饰器面试回答
时间: 2023-06-27 15:08:31 浏览: 204
以下是一些常见的 Python 装饰器面试问题及其回答:
1. 什么是装饰器?
装饰器是 Python 中一种高级的语法结构,它允许在不修改原函数代码的情况下,对函数进行增强或修改。装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个函数。
2. 装饰器有哪些应用场景?
装饰器可以用于实现各种功能,如:
- 日志记录:记录函数的调用时间、输入参数、输出结果等信息。
- 计时器:统计函数的运行时间。
- 缓存:缓存函数的输出结果,避免重复计算。
- 权限验证:验证用户是否有权调用函数。
- 接口限流:限制函数的调用频率。
3. 装饰器的语法是什么?
装饰器的语法如下:
```python
@decorator
def func():
pass
```
其中,`decorator` 是装饰器函数,`func` 是被装饰函数。装饰器函数可以在函数执行前后对函数进行修改或增强。如果需要传递参数,可以使用带参数的装饰器,如:
```python
@decorator(arg1, arg2, ...)
def func():
pass
```
4. 装饰器的执行顺序是怎样的?
多个装饰器会按照从下往上的顺序依次执行,即先执行最外层的装饰器,然后执行内层的装饰器,最后执行被装饰的函数。例如:
```python
@a
@b
@c
def func():
pass
```
执行顺序为 `func = a(b(c(func)))`。
5. 装饰器中如何传递参数?
装饰器可以使用带参数的形式,例如:
```python
def my_decorator(arg1, arg2):
def decorator(func):
def wrapper(*args, **kwargs):
# 在这里对函数进行增强或修改
return func(*args, **kwargs)
return wrapper
return decorator
@my_decorator(arg1, arg2)
def my_func():
pass
```
在这个例子中,`my_decorator` 是一个带参数的装饰器,它接收两个参数 `arg1` 和 `arg2`。`decorator` 是一个不带参数的装饰器函数,它接收一个函数作为参数,并返回一个函数。`wrapper` 是被返回的函数,它接收任意数量的位置参数和关键字参数,并在其中对函数进行增强或修改。最后,使用 `@my_decorator(arg1, arg2)` 语法将装饰器应用到函数上。
6. 装饰器中如何保留被装饰函数的元信息?
当使用装饰器时,有时候需要保留被装饰函数的元信息,例如函数名、文档字符串等。为了实现这个功能,可以使用 `functools.wraps` 装饰器,它可以将被装饰函数的元信息复制到装饰器函数中。例如:
```python
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
# 在这里对函数进行增强或修改
return func(*args, **kwargs)
return wrapper
@my_decorator
def my_func():
"""这是一个示例函数"""
pass
```
在这个例子中,使用 `@functools.wraps(func)` 语法将被装饰函数的元信息复制到 `wrapper` 函数中。这样,当调用 `help(my_func)` 时,可以看到函数的文档字符串和函数名。
阅读全文