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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:27:03