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

类方法的条件定义:Config类依任务变量动态绑定方法

问题解决与代码优化方案

原代码中,你在__init__里定义的objective只是局部函数,没有赋值给实例属性,所以创建实例后无法调用这个方法。即使补上self.objective = objective,当每个任务对应多个方法时,代码会变得杂乱,大量分支逻辑混在初始化方法里。以下是几种优化方案:

方案一:子类继承+工厂函数

把每个任务的专属参数和方法封装到独立子类中,基类保留通用逻辑,通过工厂函数根据任务类型创建对应实例。

class BaseConfig:
    def __init__(self):
        pass

class Task1Config(BaseConfig):
    def __init__(self):
        super().__init__()
        self.other_param = 1
    
    def objective(self, probs):
        return probs[0]

class Task2Config(BaseConfig):
    def __init__(self):
        super().__init__()
        self.other_param = 2
    
    def objective(self, probs):
        return probs[1]

def create_config(task):
    if task == 'Task1':
        return Task1Config()
    elif task == 'Task2':
        return Task2Config()
    else:
        raise ValueError(f"未知任务类型: {task}")

# 使用示例
config = create_config('Task1')
print(config.other_param)  # 输出 1
print(config.objective([0.5, 0.3]))  # 输出 0.5

优点:每个任务的逻辑完全独立,代码结构清晰,后续新增任务只需添加新的子类,扩展性强。

方案二:策略模式

把每个任务的参数和方法封装成策略类,在主Config类中根据任务类型选择对应策略,通过属性和方法代理调用策略逻辑。

class Task1Strategy:
    other_param = 1
    @staticmethod
    def objective(probs):
        return probs[0]

class Task2Strategy:
    other_param = 2
    @staticmethod
    def objective(probs):
        return probs[1]

class Config:
    _strategies = {
        'Task1': Task1Strategy,
        'Task2': Task2Strategy
    }
    
    def __init__(self, task='Task1'):
        self.task = task
        self.strategy = self._strategies[task]
    
    @property
    def other_param(self):
        return self.strategy.other_param
    
    def objective(self, probs):
        return self.strategy.objective(probs)

# 使用示例
config = Config('Task2')
print(config.other_param)  # 输出 2
print(config.objective([0.5, 0.3]))  # 输出 0.3

优点:Config类职责单一,策略类可复用,适合不同任务间有部分逻辑可以共享的场景。

方案三:字典映射绑定

如果不想创建过多类,可以在Config类内部用字典存储每个任务的参数和方法映射,在初始化时动态绑定到实例。

class Config:
    def __init__(self, task='Task1'):
        self.task = task
        self._setup_task()
    
    def _setup_task(self):
        task_configs = {
            'Task1': {
                'other_param': 1,
                'objective': self._task1_objective
            },
            'Task2': {
                'other_param': 2,
                'objective': self._task2_objective
            }
        }
        config = task_configs[self.task]
        self.other_param = config['other_param']
        self.objective = config['objective']
    
    def _task1_objective(self, probs):
        return probs[0]
    
    def _task2_objective(self, probs):
        return probs[1]

# 使用示例
config = Config('Task1')
print(config.other_param)  # 输出 1
print(config.objective([0.5, 0.3]))  # 输出 0.5

优点:无需额外创建类,代码紧凑,适合任务逻辑相对简单的场景。

内容的提问来源于stack exchange,提问作者T. Krivachy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:10:36