Python:使用相同方法和不同但等效的设计类

时间:2016-06-16 10:27:29

标签: python class python-3.x oop design-patterns

我有一个算法,可以在不同的数据集上执行相同的任务。基本上方法是相同的但参数是不同的。我正在尝试为此创建类,但由于我不熟悉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工作进程以及其余数据管道调用。

2 个答案:

答案 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并覆盖了您有兴趣处理的方法,例如何时看到新标记,或者有点读取数据。