2012-10-19 42 views
4

什麼是幾個相同的方法添加到幾個類最pythonic的方式?Pythonic的方式添加幾個方法到幾個類?


我可以用一個類的裝飾,但似乎在併發症的公平位,使和它更難寫,比其他方法讀取。

我可以用所有的方法創建一個基類,並讓其他類繼承,但對於某些類,我會非常想要允許多次繼承,我經常閱讀的內容將被避免或最小化。此外,「is-a」關係不適用。

我也可以將它們從方法改變爲使它們成爲獨立函數,這些函數只是希望它們的值通過鴨式輸入提供適當的屬性。這在某種程度上是乾淨的,但是它更少面向對象,並且使得它不太清楚何時可以在該類型的對象上使用函數。

我可以使用委託,但這需要所有要調用的類都有調用輔助類方法的方法。這會使代碼庫比其他選項長得多,並且每次我想向輔助類添加一個新函數時都需要添加一個委託方法。

我知道給一個類的另一個實例作爲一個屬性在某些情況下很好地工作,但它並不總是工作乾淨,並且可以使調用比其他方式更加複雜。

玩了一下之後,即使它導致多重繼承,我仍然傾向於拖拽繼承。但是由於許多文本強烈反對曾經允許多重繼承,並且一些(如wikipedia條目)甚至說只爲代碼重用(例如這樣)繼承應該被最小化,所以我猶豫不決。


這可以用一個例子可以更清晰,所以一個簡單的例子說,我們正在處理大量不同類別,所有在x有一個位置,Y網格。有很多操作我們可能想要使用x,y位置來製作所有方法,例如獲取兩個這樣的實體之間的距離的方法,或者相對方向,它們之間的中點等。

什麼將是所有這些類訪問這些僅依靠x和y作爲屬性的方法的最pythonic方式?

回答

3

對於您的具體示例,我會嘗試利用鴨子打字。編寫走哪被假定爲有xy屬性的對象樸素簡單的功能:

def distance(a, b): 
    """ 
    Returns distance between `a` and `b`. 
    `a` and `b` should have `x` and `y` attributes. 
    """ 

    return math.sqrt((a.x-b.x)**2 + (a.y-b.y)**2) 

很簡單。爲了清楚說明如何使用該功能,只需記錄它。

+0

謝謝。這看起來可能是要走的路。 – TimothyAWiseman

2

簡單的舊功能最適合這個問題。例如。而不是這個......

​​

...只是有這樣的功能這一項:

def distanceFromZeroZero(point): 
    return math.sqrt(point.x()**2 + point.y()**2) 

這是一個很好的解決方案,因爲它也很容易測試 - 這是沒有必要的子類只是爲了鍛鍊一個特定的功能。

相關問題