Python装饰器开发实践
Python装饰器开发实践:从语法糖到设计利器
装饰器的本质:语法糖背后的魔法
在Python的世界里,装饰器(Decorator)常被描述为“语法糖”,但这简单的比喻往往掩盖了其真正的威力。装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。这种“函数包装函数”的模式,为代码的扩展和维护提供了优雅的解决方案。
让我们从一个最简单的装饰器开始:
```python
def simple_decorator(func):
def wrapper():
print("函数执行前")
result = func()
print("函数执行后")
return result
return wrapper
@simple_decorator
def greet():
print("Hello, World!")
greet()
输出:
函数执行前
Hello, World!
函数执行后
```
装饰器的进阶应用
1. 带参数的装饰器
实际开发中,我们经常需要装饰器能够接受参数,以实现更灵活的配置:
```python
def repeat(n):
"""重复执行函数的装饰器"""
def decorator(func):
def wrapper(args, kwargs):
results = []
for _ in range(n):
results.append(func(args, kwargs))
return results
return wrapper
return decorator
@repeat(3)
def say_hello(name):
print(f"Hello, {name}!")
return f"Greeted {name}"
say_hello("Alice")
```
2. 保留函数元信息
装饰器会覆盖原始函数的元信息(如函数名、文档字符串等),使用`functools.wraps`可以解决这个问题:
```python
from functools import wraps
def timing_decorator(func):
@wraps(func)
def wrapper(args, kwargs):
import time
start = time.time()
result = func(args, kwargs)
end = time.time()
print(f"{func.__name__}执行时间: {end - start:.4f}秒")
return result
return wrapper
```
装饰器在Web开发中的实践
在Web框架如Flask或FastAPI中,装饰器扮演着至关重要的角色:
```python
Flask路由装饰器示例
from flask import Flask, request, jsonify
app = Flask(__name__)
def require_auth(func):
@wraps(func)
def wrapper(args, kwargs):
token = request.headers.get('Authorization')
if not token or not validate_token(token):
return jsonify({"error": "未授权\
