Можно ли определить, из какого подкласса вызывается метод

#python #inheritance #subclass #super

Вопрос:

У меня есть суперкласс с наследованием до трех подклассов. Суперкласс содержит метод, выходная переменная которого зависит от подкласса, вызывающего метод. Ниже вы видите пример, в котором я передаю методу параметр, указывающий, какие выходные данные следует генерировать.

 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') 
 

Есть ли какой-то способ сделать это?

Комментарии:

1. вам нужно sparsesvd вернуть 3 значения для других целей, или вы можете переписать метод подкласса только для того, чтобы вернуть значение, которое вам нужно в этом контексте? Другими словами, вы просто вызываете метод `sparsesvd здесь или также в другом месте

Ответ №1:

Честно говоря, то, что метод суперкласса знает, из какого подкласса он выполняется, звучит как анти-шаблон. По крайней мере, это будет означать, что вам придется корректировать суперкласс каждый раз, когда вы добавляете подкласс. Решением учебника было бы перенести эти сведения в метод, который переопределяют подклассы. Например.:

 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]