You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于装饰器实现类内方法的分组注册与批量执行?

实现类内方法的多标签归类与批量执行

这个需求很常见,要实现类内方法的多标签归类+批量执行,关键是解决装饰器无法在方法定义阶段直接操作类属性的问题——因为方法定义时类还没完全创建出来。这里有个简洁的实现方案,分两步走:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:03:15