python装饰器详解
时间: 2023-07-06 15:33:57 浏览: 104
装饰器是 Python 中非常有用的语法,它允许我们在不改变函数源代码的情况下,对函数的功能进行扩展。装饰器本质上是一个函数,它可以接受一个函数作为参数,并返回一个新的函数。
装饰器的基本语法如下:
```python
@decorator_function
def some_function():
# do something
```
其中,`decorator_function` 是装饰器函数,`some_function` 是需要被装饰的函数。
装饰器函数可以用来扩展被装饰函数的功能,比如增加日志、计时等。下面是一个简单的装饰器函数:
```python
def my_decorator(func):
def wrapper():
print("Before the function is called.")
func()
print("After the function is called.")
return wrapper
```
这个装饰器函数接受一个函数作为参数,并返回一个新的函数。新的函数 `wrapper` 在被调用时会先打印一句话,然后调用原函数 `func`,最后再打印一句话。
我们可以使用这个装饰器函数来装饰一个函数,比如:
```python
@my_decorator
def say_hello():
print("Hello!")
```
当我们调用 `say_hello` 函数时,会依次打印出 "Before the function is called."、"Hello!" 和 "After the function is called."。
除了类似于上面的装饰器函数,还有一种更加常用的装饰器语法,它使用了 Python 的语法糖。下面是一个例子:
```python
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("Before the function is called.")
result = func(*args, **kwargs)
print("After the function is called.")
return result
return wrapper
```
这个装饰器函数和上面的例子非常相似,唯一的区别是使用了 `@functools.wraps(func)` 语法糖。这个语法糖会自动将新函数的名称和文档字符串设置为原函数的名称和文档字符串,这样可以避免一些问题。
除了上面的例子,还有很多其他有用的装饰器,比如用来缓存函数结果的 `@lru_cache`,用来检查函数参数类型的 `@type_check`,用来限制函数调用频率的 `@rate_limit` 等。这些装饰器都可以帮助我们更加方便地编写 Python 代码。
阅读全文