2020-09-10 18:39:30
在 Python 中,Decorator(装饰器) 是一种强大的元编程工具,可用于动态增强类或方法的功能,而无需修改原始代码。通过装饰器,可以实现日志记录、计时、权限控制、自动注册子类等高级功能。以下是具体实现方法和示例:
1. 使用类装饰器增强类功能类装饰器接收一个类作为参数,返回修改后的类或新类,适用于在类定义时注入通用逻辑(如自动添加方法、注册子类等)。
示例 1:自动添加 __repr__ 方法def add_repr(cls): def __repr__(self): return f"{cls.__name__}({', '.join(f'{k}={v}' for k, v in self.__dict__.items())})" cls.__repr__ = __repr__ return cls@add_reprclass Person: def __init__(self, name, age): self.name = name self.age = agep = Person("Alice", 30)print(p) # 输出: Person(name=Alice, age=30)方法装饰器用于修饰类的特定方法,实现计时、缓存、权限控制等功能。结合 functools.wraps 可保留原方法的元信息(如 __name__)。
示例 1:计时装饰器import timefrom functools import wrapsdef timer(func): @wraps(func) def wrapper(*args, kwargs): start = time.time() result = func(*args, kwargs) # 修正:原代码中 args 错误传递为元组 duration = time.time() - start print(f"{func.__name__} 执行耗时: {duration:.4f} 秒") return result return wrapperclass DataProcessor: @timer def process(self): time.sleep(1) return "处理完成"dp = DataProcessor()dp.process() # 输出执行时间装饰器可访问类的属性和方法,实现类似元类的功能(如验证类结构、动态修改行为),但更简洁。
示例:验证类属性def validate_attributes(required_attrs): def decorator(cls): for attr in required_attrs: if not hasattr(cls, attr): raise AttributeError(f"类 {cls.__name__} 缺少必需属性 {attr}") return cls return decorator@validate_attributes(["name", "age"])class Person: def __init__(self, name, age): self.name = name self.age = age# 正确执行p = Person("Alice", 30)# 若删除 name 或 age 属性,会触发 AttributeError通过合理使用装饰器,可以编写出更清晰、可复用的代码,同时支持灵活的元编程需求。