Python中如何检测超类方法的调用来源子类?
实现方案说明
有两种常用的实现方式,优先推荐第一种符合面向对象设计的多态方案:
方案1:多态实现(推荐)
该方案符合开闭原则,后续新增子类不需要修改超类已有代码,也不需要硬编码判断子类标识:
from abc import ABC, abstractmethod import sparsesvd class BaseReducer(ABC): # 超类公共逻辑:仅负责通用的SVD计算 def dimensionality_reduction(self, sparse_weighted_matrix, factors): ut, _, v = sparsesvd(sparse_weighted_matrix, factors) # 调用子类各自实现的返回逻辑 return self._get_result(ut, v) # 抽象方法,强制所有子类必须实现自己的返回规则 @abstractmethod def _get_result(self, ut, v): raise NotImplementedError("子类必须实现_get_result方法")
子类实现示例:
# 对应返回ut的子类 class MethodAReducer(BaseReducer): def _get_result(self, ut, v): return ut # 对应返回v的子类 class MethodBReducer(BaseReducer): def _get_result(self, ut, v): return v # 第三个子类可自定义返回规则 class MethodCReducer(BaseReducer): def _get_result(self, ut, v): return ut.dot(v) # 示例逻辑,可按需修改
使用时直接实例化对应子类调用方法即可,不需要传入任何类型标记参数:
reducer_a = MethodAReducer() result = reducer_a.dimensionality_reduction(your_matrix, 10) # 自动返回ut
方案2:超类直接判断子类名称(快速实现)
如果只是临时优化不想改动太多代码,可以直接通过self.__class__.__name__获取当前调用方的子类名,完全匹配你预期的写法:
def dimensionality_reduction(self, sparse_weighted_matrix, factors): ut, _, v = sparsesvd(sparse_weighted_matrix, factors) subclass_name = self.__class__.__name__ if subclass_name == 'MethodA': return ut elif subclass_name == 'MethodB': return v else: raise Exception('Invalid algorithm selected')
注意:该方案后续新增子类时需要同步修改超类的判断逻辑,不符合开闭原则,仅适合小项目临时使用。另外你写的示例代码里
elif后用了单等号=属于语法错误,需要修改为双等号==。
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

