[英]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.