簡體   English   中英

Python:使用相同的方法設計類,但方法不同但等效

[英]Python: Design classes with same methods and different but equivalent

我有一種算法,可以對不同的數據集執行相同的任務。 本質上,方法是相同的,但參數是不同的。 我正在嘗試為此創建類,但是由於我不熟悉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輔助進程中調用。

為什么不將不同的數據集傳遞給算法類,而不是為不同的算法創建兩個類。

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

如圖所示,該示例完全不需要繼承。

假設數據集提供相同的接口,例如元組列表或字典列表,則MyAlgorithm類足以處理兩個數據集。

如果數據格式不同(例如,字段數不同),或者字段因數據類型或語義不同而具有不同的處理要求,則子類化和覆蓋相關處理方法似乎是一種合理的方法。

存在這種策略的許多示例。 來自Python 3標准庫的一個就是html.parser ,它提供了基類HTMLParser ,您可以從該基類繼承並覆蓋您有興趣處理的方法,例如,看到新標記或讀取一些數據時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM