类方法的条件定义: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
相关产品推荐
相关产品推荐

