我有一个算法,可以在不同的数据集上执行相同的任务。基本上方法是相同的但参数是不同的。我正在尝试为此创建类,但由于我不熟悉OOP设计原则,我有点困惑如何做到这一点。
因为,算法是相同的,我想我可以创建一个公共类,从中继承与两个不同数据集相关的类。例如,
class MyAlgorithm():
def __init__(self, column1, column2):
self.column1 = column1
self.column2 = column2
def step1():
# do sth with dataset
def step2():
# do sth with result of step1()
class Dataset1Class(MyAlgorithm):
def __init__(self, dbconn, tablename='dataset2table'):
self.dbconn = dbconn
self.tablename = tablename
def get_data(dbconn, tablename):
# get data from database for one date
(column1A, column1B) = data_query # not shown
return column1A, column1B
class Dataset2Class(MyAlgorithm):
def __init__(self, dbconn, tablename='dataset1table'):
self.dbconn = dbconn
self.tablename = tablename
def get_data(dbconn, tablename):
# get data from database for one date
(column2X, column2Y) = data_query # not shown
return column2X, column2Y
我在这里简化了一下,数据源实际上是一个数据库,但我认为这可能不是最好的方法。所以,我想知道有经验的Pythonista会如何做到这一点。还有另一种更好的方法吗?此代码是更大代码库的一部分,最终将从Celery工作进程以及其余数据管道调用。
答案 0 :(得分:0)
为什么不将不同的数据集传递给算法类,而不是为不同的算法创建两个类。
class Algorithm:
def __init__(self, dataset):
self.dataset = dataset
def method_1():
"""this is your algo implementation"""
# perform action here on your dataset using self.dataset
答案 1 :(得分:0)
如图所示,该示例根本不需要继承。
假设数据集提供相同的接口,例如一个元组列表或一个字典列表,类MyAlgorithm
足以处理这两个数据集。
如果数据格式不同,例如由于不同的数据类型或语义,不同数量的字段或字段具有不同的处理要求,然后对相关处理方法进行子分类和覆盖似乎是一种合理的方法。
存在许多这种策略的例子。 Python 3标准库中的一个是html.parser
,它提供了您继承的基类HTMLParser
并覆盖了您有兴趣处理的方法,例如何时看到新标记,或者有点读取数据。