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):
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 add(a, b):
return a + b
@log_decorator
def multiply(a, b):
return a * b
print(add(3, 5)) # 输出:8
print(multiply(4, 6)) # 输出:24
```
带参数的装饰器
```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")
输出 3 次 "Hello, 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.is_authenticated:
raise PermissionError("用户未登录")
return func(user, *args, **kwargs)
return wrapper
```
总结
装饰器是 Python 中实现 AOP(面向切面编程)的重要工具,广泛应用于日志记录、性能监控、权限验证、缓存等场景。掌握装饰器能让你的代码更加优雅和可维护。
觉得有用就点个赞吧!欢迎在评论区分享你的装饰器使用经验。