Python中的装饰器是一种强大的工具,允许我们在不修改原始函数代码的基础上,通过在函数定义之前插入一段代码来增强或修改函数的行为。装饰器实质上是一个接收函数作为输入并返回新函数的高阶函数。
以下是一些常见的装饰器类别和示例:
-
基本装饰器
def simple_decorator(original_function): def wrapper(*args, **kwargs): print("Before calling original function") result = original_function(*args, **kwargs) print("After calling original function") return result return wrapper @simple_decorator def say_hello(name): print(f"Hello, {name}!") say_hello("World") # 输出:Before calling original function \n Hello, World! \n After calling original function
-
带参数的装饰器
def logged(prefix=""): def decorator(func): def wrapper(*args, **kwargs): print(f"{prefix} Calling {func.__name__}") result = func(*args, **kwargs) print(f"{prefix} Done with {func.__name__}") return result return wrapper return decorator @logged(prefix="INFO: ") def do_something_useful(): print("Doing something useful here.") do_something_useful() # 输出:INFO: Calling do_something_useful \n Doing something useful here. \n INFO: Done with do_something_useful
-
类装饰器
class DebugInfo: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print(f"Calling {self.func.__name__} with args={args}, kwargs={kwargs}") result = self.func(*args, **kwargs) print(f"Finished {self.func.__name__}") return result @DebugInfo def divide(a, b): return a / b print(divide(10, 2)) # 输出:Calling divide with args=(10, 2), kwargs={} # 输出:5.0 # 输出:Finished divide
-
使用
functools.wraps
保留原函数属性from functools import wraps def timing_decorator(func): @wraps(func) def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} took {end_time - start_time:.6f} seconds to run.") return result return wrapper @timing_decorator def long_running_operation(): # 假设这里是耗时操作 time.sleep(2) long_running_operation() # 输出:long_running_operation took XX.XX seconds to run.
-
Python 3.4+ 的
@functools.lru_cache
(LRU 缓存)装饰器from functools import lru_cache @lru_cache(maxsize=32) def fibonacci(n): if n < 2: return n return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(30)) # 使用缓存提高重复调用效率
以上介绍了几种常见的Python装饰器,它们在实际开发中有着广泛的应用,如日志记录、性能监控、缓存、权限验证等。