#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]