是否可以检测从哪个子类调用方法

Is it possible to detect which subclass a method is called from

我有一个继承了三个子类的超类。超类包含一个方法,其输出变量取决于调用该方法的子类。下面,您将看到一个示例,其中我为方法提供了一个参数来指示要生成的输出。

def dimensionality_reduction(self, algorithm, sparse_weighted_matrix, factors):
    ut, _, v = sparsesvd(sparse_weighted_matrix, factors)
    if algorithm == 'a':
        return ut
    elif algorithm = 'b':
        return v
    else:
        raise Exception('Invalid algorithm selected') 

相反,我希望这个超类方法能够识别调用该方法的子类。

我正在考虑类似的事情:

def dimensionality_reduction(self, sparse_weighted_matrix, factors):
    ut, _, v = sparsesvd(sparse_weighted_matrix, factors)
    if subclass == 'method_a':
        return ut
    elif subclass = 'method_b':
        return v
    else:
        raise Exception('Invalid algorithm selected') 

有什么办法吗?

老实说,让超类的方法知道它从哪个子类执行听起来像是一种反模式。至少,这意味着每次添加子类时都必须调整超类。教科书解决方案是将这些细节移动到子类覆盖的方法中。例如:

class Superclass:
    def handle_sparsesvd_result(self, result):
        # Must be overridden by subclasses
        raise Exception('Invalid algorithm selected') 

    def dimensionality_reduction(self, algorithm, sparse_weighted_matrix, factors):
        result = sparsesvd(sparse_weighted_matrix, factors)
        return self.handle_sparsesvd_result(result)

class SubClassA(SuperClass):
    def handle_sparsesvd_result(self, result):
        return result[0] 

class SubClassB(SuperClass):
    def handle_sparsesvd_result(self, result):
        return result[2]