Python装饰器应用场景

Python装饰器本质上是一个函数,用于在不修改原函数的情况下,动态地为函数添加额外的功能。以下是装饰器的详细解析:

  1. 基本概念示例
def my_decorator(func):
    def wrapper():
        print("在函数调用前执行")
        func()  # 调用原始函数
        print("在函数调用后执行")
    return wrapper

@my_decorator
def say_hello():
    print("Hello, World!")

# 等价于 say_hello = my_decorator(say_hello)
say_hello()  # 输出会包含装饰器的额外操作
  1. 常见应用场景

a. 性能统计

import time

def timer(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} 秒")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(2)

b. 权限验证

def login_required(func):
    def wrapper(*args, **kwargs):
        if not is_logged_in():
            print("请先登录")
            return None
        return func(*args, **kwargs)
    return wrapper

@login_required
def sensitive_operation():
    print("执行敏感操作")

c. 日志记录

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数: {func.__name__}")
        print(f"参数: {args}, {kwargs}")
        result = func(*args, **kwargs)
        print(f"返回结果: {result}")
        return result
    return wrapper

@logger
def add(a, b):
    return a + b
  1. 带参数的装饰器
def repeat(times):
    def decorator(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}")
  1. 类装饰器
class CountCalls:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0
    
    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print(f"Call {self.num_calls} of {self.func.__name__}")
        return self.func(*args, **kwargs)

@CountCalls
def test_function():
    print("Executing test function")
  1. 多个装饰器
@decorator1
@decorator2
def my_function():
    pass
# 等价于 my_function = decorator1(decorator2(my_function))

装饰器的主要作用:

  • 在不修改原函数的情况下添加功能
  • 代码复用
  • 解耦核心逻辑和周边功能
  • 动态修改函数行为

适用场景:

  • 性能监控
  • 日志记录
  • 权限控制
  • 缓存
  • 参数验证
  • 事务管理

最佳实践:

  • 使用functools.wraps保留原函数的元数据
  • 避免过度使用
  • 保持装饰器的单一职责
from functools import wraps

def my_decorator(func):
    @wraps(func)  # 保留原函数的元数据
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

装饰器是Python中非常灵活和强大的特性,可以大大简化代码,提高代码的可读性和可维护性。

posted on 2024-11-26 17:23  滚动的蛋  阅读(11)  评论(0编辑  收藏  举报

导航