2017-04-26 40 views
0

所以我有一個Polynomial超類和一個二次型子類,我想修改add運算符,所以不是返回一個多項式對象,而是返回一個二次對象,我該怎麼做?在類層次結構中修改方法

下面是這個多項式添加,它返回一個多項式對象

def __add__(self, other): 
     newPoly = Polynomial() 
     for i in range(len(self.coeffs)): 
      newPoly.addterm(self.coeffs[i][0], self.coeffs[i][1]) 
      newPoly.addterm(other.coeffs[i][0], other.coeffs[i][1]) 
     return (newPoly) 

,這是二次類:

class Quadratic(Polynomial): 
    def __init__(self, quad, lin, con): 
     Polynomial.__init__(self, (quad, 2), (lin, 1), (con, 0)) 

所以,我怎麼能修改添加操作,因此返回一個二次方對象而不是多項式?

+5

向二次曲面添加某些東西不一定是二次曲面;它可能是更高的程度,或者二次項可能會被抵消。 Quadratic看起來更像是Polynomial類的特殊構造函數,而不是應該是子類的東西。 – jasonharper

回答

0

它看起來讓我覺得你試圖從超類的方法中返回一個子類的實例,因爲超類通常意味着一個更一般的概念。

我想你可以調用二次的構造函數傳入相應的參數。

def __add__(self, other): 
     newQuad = Quad(0,0,0) 
     for order,(c1,c2) in enumerate(zip(self.coeffs,other.other)): 
      newQuad.addterm(c1[0], c1[1]) 
      newQuad.addterm(c2[0], c2[1]) 
      if order == 1: 
       break 

     return (newQuad) 

我已經被一個更可讀的,Python的方式修改你的代碼。

說實話,我不認爲有任何必要爲每個訂單派生一個子類,您可以通過一個示例簡單記錄訂單信息的附加屬性。

最後,不建議在子類的代碼中明確地寫出超類的名稱,因爲它會降低靈活性.Python有一個名爲「super」的關鍵字,它可以讓你直接調用超類的方法,關於關鍵字的很多細節,所以你可能想自己學習文檔。