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
import functools
from datetime import datetime
def log_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"[{datetime.now()}] 调用函数:{func.name}")
result = func(*args, **kwargs)
print(f"[{datetime.now()}] 函数执行完成")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
@log_decorator
def multiply(a, b):
return a * b
print(add(3, 5))
print(multiply(4, 6))
```
带参数的装饰器
```python
def repeat(times):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
greet("World")
```
实际应用场景
1. 性能计时
```python
import time
def timer_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
@timer_decorator
def slow_function():
time.sleep(1)
return "完成"
slow_function()
```
2. 权限验证
```python
def require_auth(func):
@functools.wraps(func)
def wrapper(user, *args, **kwargs):
if not user.get('is_authenticated'):
raise PermissionError("用户未认证")
return func(user, *args, **kwargs)
return wrapper
@require_auth
def view_dashboard(user):
return "欢迎查看仪表盘"
```
小结
装饰器是 Python 高级编程的核心概念之一,掌握它可以让你的代码更加优雅和可维护。记住关键点:
-
装饰器本质是返回函数的函数
-
使用 `@functools.wraps` 保留原函数信息
-
使用 `*args, **kwargs` 支持任意参数
-
可以堆叠多个装饰器
动手实践是掌握装饰器的最佳方式,试试创建你自己的装饰器吧!