如何基于装饰器实现类内方法的分组注册与批量执行?
实现类内方法的多标签归类与批量执行
这个需求很常见,要实现类内方法的多标签归类+批量执行,关键是解决装饰器无法在方法定义阶段直接操作类属性的问题——因为方法定义时类还没完全创建出来。这里有个简洁的实现方案,分两步走:
1. 定义标签装饰器,给方法打标记
首先我们需要一组装饰器,它们的作用不是直接修改类属性,而是给被装饰的方法添加“标签标记”,记录这个方法属于哪些类别:
def tag_decorator(tag_name): def decorator(func): # 给方法添加一个集合属性,存储它的所有标签 if not hasattr(func, '_rule_tags'): func._rule_tags = set() func._rule_tags.add(tag_name) return func return decorator # 生成具体的标签装饰器 red = tag_decorator('red') blue = tag_decorator('blue') hard = tag_decorator('hard') soft = tag_decorator('soft')
2. 定义类装饰器,统一注册标记方法
接下来写一个类装饰器,它会在类完全定义完成后,遍历类内的所有方法,把带标记的方法批量注册到对应的类集合属性中:
def register_rules(cls): # 初始化类的规则集合(如果类里没提前定义的话) rule_set_names = ['red_rules', 'blue_rules', 'hard_rules', 'soft_rules'] for set_name in rule_set_names: if not hasattr(cls, set_name): setattr(cls, set_name, set()) # 遍历类的所有属性,筛选出带标签的方法并注册 for attr_name, attr_value in cls.__dict__.items(): if callable(attr_value) and hasattr(attr_value, '_rule_tags'): for tag in attr_value._rule_tags: target_set = getattr(cls, f'{tag}_rules') target_set.add(attr_value) return cls
3. 应用到你的类中
现在就可以按照你想要的结构写类了,记得加上类装饰器:
@register_rules class MyClass: def __init__(self): # 把类级别的集合绑定到实例上(方便调用,也可以直接用类访问) self.red_rules = self.__class__.red_rules self.blue_rules = self.__class__.blue_rules self.hard_rules = self.__class__.hard_rules self.soft_rules = self.__class__.soft_rules @red def rule_one(self): return 1 @blue @hard def rule_two(self): return 2 @hard def rule_three(self): return 3 @blue @soft def rule_four(self): return 4
测试执行
实例化后就能轻松合并集合并执行指定规则了:
obj = MyClass() # 合并red和soft规则并执行 target_rules = obj.red_rules.union(obj.soft_rules) for rule_func in target_rules: print(rule_func(obj)) # 输出:1 4
关键说明
- 标签装饰器只是给方法打标记,不会直接操作类,避免了“方法定义时类未创建”的问题;
- 类装饰器在类创建完成后执行,此时可以安全地访问和修改类属性;
- 支持多标签组合,比如
@blue@hard的方法会被同时加入blue_rules和hard_rules集合; - 规则集合是类级别的,所有实例共享同一批规则(如果需要每个实例有独立集合,可以在
__init__里创建副本)。
内容的提问来源于stack exchange,提问作者mart1n
相关产品推荐
相关产品推荐

