是否可以检测从哪个子类调用方法
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]
我有一个继承了三个子类的超类。超类包含一个方法,其输出变量取决于调用该方法的子类。下面,您将看到一个示例,其中我为方法提供了一个参数来指示要生成的输出。
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]