如何创建整合多兄弟类实例方法的抽象基类合法子类
你当前的实现从技术逻辑上可以正常运行,但存在笔误、冗余代码、可维护性差的问题,更推荐用常规组合类的方式实现需求。
现有实现的问题
- 存在多处笔误:
settattr应为setattr,循环里的results是未定义变量,应为result;ChildClass1、ChildClass2的evaluate方法定义末尾缺少冒号,会触发语法错误。 - 手动调用
__get__绑定实例方法的写法虽然可行,但可读性差,Python标准库types.MethodType可以实现完全一致的效果,写法更直观:new_c.evaluate = types.MethodType(new_evaluate, new_c)。 - 冗余代码多:
GeneralChildClass里的空evaluate方法完全没用,创建实例后会被直接覆盖;动态绑定方法的方式无法被静态类型检查工具识别,后期维护容易出问题。
更推荐的实现方案
你要实现的是典型的组合模式逻辑,行为固定不需要动态生成,直接写常规的基类子类即可,完全不需要动态绑定方法:
from abc import ABC, abstractmethod from typing import List class MyBaseClass(ABC): def __init__(self, x: int): self.x = x self.y = None @abstractmethod def evaluate(self, val: float) -> float: pass def get_y(self) -> float: return self.y class ChildClass1(MyBaseClass): def evaluate(self, val: float) -> float: self.y = val*val return val * self.x class ChildClass2(MyBaseClass): def evaluate(self, val: float) -> float: self.y = val**0.5 return val / self.x class CombinedChildClass(MyBaseClass): def __init__(self, object_list: List[MyBaseClass]): # 组合类不需要用到x参数,随便传一个默认值即可 super().__init__(0) self.object_list = object_list def evaluate(self, val: float) -> float: total_result = 0.0 total_y = 0.0 for obj in self.object_list: total_result += obj.evaluate(val) total_y += obj.y self.y = total_y return total_result / len(self.object_list) # 用法完全符合你的需求 c1 = ChildClass1(5) c2 = ChildClass1(2) c3 = ChildClass2(10) c_list = [c1, c2, c3] c4 = CombinedChildClass(c_list) c4.evaluate(4.5) print(c4.get_y()) # 支持嵌套组合 c5 = CombinedChildClass([c4, c1]) c5.evaluate(3.2) print(c5.get_y())
该方案完全符合抽象基类约定,支持类型检查和代码补全,没有动态绑定的各类边界问题,维护成本低。
内容的提问来源于stack exchange,提问作者NMme
相关产品推荐
相关产品推荐

