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 代码更上一层楼!