編輯:有一些混淆,但我想問一個關於Python中面向對象設計的常見問題。Python中from_ <type>的繼承
考慮一類,可以讓你的數據值映射到計數或頻率:
class DataMap(dict):
pass
現在考慮一個子類,它可以讓你從數據列表構建一個直方圖:
class Histogram(DataMap):
def __init__(self, list_of_values):
# 1. Put appropriate super(...) call here if necessary
# 2. Build the map of values to counts in self
pass
現在考慮一個類,可以讓你製作一個平滑的概率質量表,而不是一個Histogram
。
class ProbabilityMass(DataMap):
pass
什麼是允許ProbabilityMass
從無論是Histogram
或值列表構造最好的辦法?我使用C++編程「長大」,在這種情況下,我會使用重載的構造函數。在Python我想用這樣的:
- 的構造函數多個參數(所有,但這些應該==無)
- 我定義from_Histogram和from_list方法
在第二種情況(我相信這是更好的),允許from_list
方法使用Histogram
構造函數中的共享代碼的最佳方法是什麼? A ProbabilityMass
表格與Histogram
表格幾乎相同,但它被縮放以便所有值的總和爲1.0。
如果您遇到類似問題,請分享您的專業知識!
奧利弗,這個問題已被問過其他時間,雖然我很難找出正確的關鍵字來找到他們現在。基本上,使用'staticmethod'來調用構造函數作爲替代構造函數。 – agf
@agf我應該定義兩個靜態方法(ProbabilityMass.from_list和ProbabilityMass.from_histogram)嗎?或者,如果他們中的一個使用__init__方法?或者也許有一些「構造函數重載」機器或標準我不知道(也許這是你的意思是「替代構造函數」)? – user
如果其中一個明顯是「默認」/最通用的那個,則將其用作__init__。如果兩者都不是,你可以選擇一個作爲'__init__',或者你可以將通用代碼分解爲'__init__',並且在進行預處理之後都有靜態方法調用它。 (請確保在docstring中注意不要直接調用構造函數)。 – agf