2026-10-23 09:49:44
Python装饰器的高级应用可以通过巧妙的设计实现函数重载和参数验证功能。以下是具体实现方法及示例:
一、函数重载的实现Python原生不支持函数重载,但可通过装饰器模拟实现。核心思路是维护一个类型签名到函数的映射字典,根据参数类型自动匹配对应实现。
class FunctionOverload: def __init__(self): self.functions = {} def register(self, *types): def decorator(func): self.functions[types] = func return func return decorator def __call__(self, *args): types = tuple(type(arg) for arg in args) if types in self.functions: return self.functions[types](*args) raise TypeError(f"No matching function for types: {types}")# 使用示例overload = FunctionOverload()@overload.register(int, int)def add(x, y): return x + y@overload.register(str, str)def add(x, y): return f"{x}{y}"print(add(1, 2)) # 输出: 3print(add("a", "b")) # 输出: ab关键点:
装饰器可对函数参数进行动态检查,包括类型验证和范围验证等。
1. 类型验证def validate_types(type_checks): def decorator(func): def wrapper(*args, kwargs): # 检查位置参数类型 for i, (arg, expected_type) in enumerate(zip(args, type_checks.values())): if not isinstance(arg, expected_type): raise TypeError(f"Arg {i} must be {expected_type}, got {type(arg)}") # 检查关键字参数类型 for name, arg in kwargs.items(): if name in type_checks and not isinstance(arg, type_checks[name]): raise TypeError(f"Arg '{name}' must be {type_checks[name]}, got {type(arg)}") return func(*args, kwargs) return wrapper return decorator# 使用示例@validate_types(x=int, y=str)def process_data(x, y): print(f"Processing {x} and {y}")process_data(10, "text") # 正常执行process_data("10", 20) # 抛出TypeError2. 范围验证def validate_range(min_val=None, max_val=None): def decorator(func): def wrapper(x): if min_val is not None and x < min_val: raise ValueError(f"Value must be ≥ {min_val}") if max_val is not None and x > max_val: raise ValueError(f"Value must be ≤ {max_val}") return func(x) return wrapper return decorator# 使用示例@validate_range(min_val=0, max_val=100)def set_volume(level): print(f"Volume set to {level}")set_volume(50) # 正常执行set_volume(-5) # 抛出ValueError三、高级技巧:组合多个验证可通过嵌套装饰器实现多重验证:
@validate_types(x=int, y=int)@validate_range(min_val=0)def divide(x, y): return x / y# 等效于:def divide(x, y): return x / ydivide = validate_range(min_val=0)(validate_types(x=int, y=int)(divide))四、最佳实践建议通过装饰器实现函数重载和参数验证,可以显著提升代码的健壮性和可读性,同时保持核心业务逻辑的简洁性。这种模式在框架开发、API设计和数据校验等场景中尤为实用。