Python 装饰器详解:从入门到实战
# Python 装饰器详解:从入门到实战
## 什么是装饰器?
装饰器(Decorator)是 Python 中的一种高级特性,它允许我们在不修改原函数代码的情况下,为函数添加新的功能。简单来说,装饰器就是一个"包装器",它可以在函数执行前后添加额外的逻辑。
## 装饰器的基本语法
装饰器使用 `@` 符号来表示,放在函数定义的上方:
```python
def my_decorator(func):
def wrapper():
print("函数执行前")
func()
print("函数执行后")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
# 输出:
# 函数执行前
# Hello!
# 函数执行后
```
## 带参数的装饰器
实际开发中,我们经常需要处理带参数的函数:
```python
def my_decorator(func):
def wrapper(*args, **kwargs):
print("函数执行前")
result = func(*args, **kwargs)
print("函数执行后")
return result
return wrapper
@my_decorator
def greet(name, age):
print(f"姓名:{name}, 年龄:{age}")
return "完成"
result = greet("张三", 25)
print(result)
```
## 实用的装饰器示例
### 1. 日志装饰器
```python
import functools
from datetime import datetime
def log_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] 调用函数:{func.__name__}")
result = func(*args, **kwargs)
print(f"[{timestamp}] 函数执行完成")
return result
return wrapper
@log_decorator
def calculate_sum(a, b):
return a + b
calculate_sum(10, 20)
```
### 2. 性能计时装饰器
```python
import time
import functools
def timing_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 执行时间:{end - start:.4f}秒")
return result
return wrapper
@timing_decorator
def slow_function():
time.sleep(1)
return "完成"
slow_function()
```
### 3. 重试装饰器
```python
import functools
import time
def retry_decorator(max_retries=3, delay=1):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for i in range(max_retries):
try:
return func(*args, **kwargs)
except Exception as e:
if i == max_retries - 1:
raise
print(f"重试 {i + 1}/{max_retries}: {e}")
time.sleep(delay)
return wrapper
return decorator
@retry_decorator(max_retries=3, delay=2)
def risky_operation():
# 可能失败的操作
pass
```
## 类装饰器
装饰器不仅可以装饰函数,还可以装饰类:
```python
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class Database:
def __init__(self):
print("数据库连接已建立")
db1 = Database()
db2 = Database()
print(db1 is db2) # True
```
## 总结
装饰器是 Python 中非常强大的工具,合理使用可以让代码更加简洁、优雅。常见的应用场景包括:
- 日志记录
- 性能监控
- 权限验证
- 缓存机制
- 事务处理
掌握装饰器,让你的 Python 代码更上一层楼!
更多推荐



所有评论(0)