简介
Python 方法装饰器是强大的工具,它允许开发者在不直接更改函数和方法源代码的情况下对其进行修改或增强。本教程将探讨有效使用方法装饰器的技巧,为那些希望编写更优雅、高效代码的 Python 程序员深入讲解其语法、实际应用及性能考量。
Python 方法装饰器是强大的工具,它允许开发者在不直接更改函数和方法源代码的情况下对其进行修改或增强。本教程将探讨有效使用方法装饰器的技巧,为那些希望编写更优雅、高效代码的 Python 程序员深入讲解其语法、实际应用及性能考量。
Python 中的方法装饰器是一种强大的方式,用于在不直接更改函数和方法源代码的情况下对其进行修改或增强。它们提供了一种简洁且可复用的机制来扩展功能。
def my_decorator(func):
def wrapper(*args, **kwargs):
## 在函数执行前要执行的代码
result = func(*args, **kwargs)
## 在函数执行后要执行的代码
return result
return wrapper
@my_decorator
def example_function():
pass
| 装饰器类型 | 描述 | 使用场景 |
|---|---|---|
| 函数装饰器 | 修改函数行为 | 日志记录、计时、认证 |
| 方法装饰器 | 增强类方法的功能 | 验证、缓存 |
| 类装饰器 | 修改整个类的行为 | 单例模式、注册 |
def log_function_call(func):
def wrapper(*args, **kwargs):
print(f"调用函数: {func.__name__}")
result = func(*args, **kwargs)
print(f"函数 {func.__name__} 执行完毕")
return result
return wrapper
@log_function_call
def greet(name):
print(f"你好, {name}!")
greet("LabEx 用户")
functools.wraps 来保留函数元数据import time
import functools
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} 执行耗时 {end_time - start_time:.4f} 秒")
return result
return wrapper
@timer
def slow_function():
time.sleep(2)
def memoize(func):
cache = {}
@functools.wraps(func)
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
@memoize
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
def authenticate(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
user = kwargs.get('user')
if not user or not user.is_authenticated:
raise PermissionError("需要认证")
return func(*args, **kwargs)
return wrapper
class User:
def __init__(self, is_authenticated=False):
self.is_authenticated = is_authenticated
@authenticate
def sensitive_operation(user):
print("正在执行敏感操作")
| 模式 | 目的 | 关键特性 |
|---|---|---|
| 计时 | 性能测量 | 跟踪执行时间 |
| 缓存 | 性能优化 | 存储并复用结果 |
| 认证 | 访问控制 | 验证用户权限 |
| 日志记录 | 调试 | 捕获函数调用细节 |
def decorator1(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("装饰器 1 之前")
result = func(*args, **kwargs)
print("装饰器 1 之后")
return result
return wrapper
def decorator2(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("装饰器 2 之前")
result = func(*args, **kwargs)
print("装饰器 2 之后")
return result
return wrapper
@decorator1
@decorator2
def combined_example():
print("原始函数")
functools.wraps 保留元数据functools 保留元数据学习装饰器时,从简单模式开始,逐步探索更复杂的用例。LabEx 建议通过实践每种模式来建立扎实的理解。
import time
import functools
def measure_decorator_overhead(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
end = time.perf_counter()
print(f"装饰器开销: {(end - start) * 1000000:.2f} 微秒")
return result
return wrapper
@measure_decorator_overhead
def sample_function(n):
return sum(range(n))
| 指标 | 影响 | 建议 |
|---|---|---|
| 执行时间 | 开销低 | 用于简单操作 |
| 内存使用 | 增加极少 | 避免复杂逻辑 |
| 调用频率 | 在大规模时影响显著 | 缓存开销大的操作 |
import functools
def optimized_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
## 使用 lru_cache 进行自动记忆化
return func(*args, **kwargs)
return wrapper
@functools.lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
def parametrized_decorator(param):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
## 基于参数的自定义逻辑
print(f"装饰器参数: {param}")
return func(*args, **kwargs)
return wrapper
return decorator
@parametrized_decorator(level='debug')
def example_function():
pass
import cProfile
import pstats
def profile_decorator(func):
def wrapper(*args, **kwargs):
profiler = cProfile.Profile()
try:
return profiler.runcall(func, *args, **kwargs)
finally:
stats = pstats.Stats(profiler).sort_stats('cumulative')
stats.print_stats()
return wrapper
functools.wraps 保留函数元数据functools.lru_cache 进行记忆化LabEx 建议采用系统的方法来实现装饰器:
通过掌握 Python 中的方法装饰器,开发者能够创建更具模块化、可复用性和可维护性的代码。本教程中讨论的技术展示了装饰器如何将普通方法转变为用于日志记录、认证、缓存和性能优化的复杂工具,最终使程序员能够编写更智能、灵活的 Python 应用程序。