2015-06-12 38 views
2

我有一種方法來實現rmul,使它在兩個方向工作?我使用mul將元素R3中的兩個向量a和b逐個元素相乘。後來我想用一個像2 * a和* 2這樣的運算符將每個元素乘以一個數字。貫徹__rmul__從雙方,python

class R3(object): 
    def __init__(self,an_array): 
     self.a = an_array # of length 3 
     self.s = 3 

    def __mul__(self,that): 
     tmp = [0]*self.s 
     for i in range(self.s): 
      tmp[i] = self.a[i]*that.a[i] 
     return self.__class__(tmp) 

    def __rmul__(self,that): 
     tmp = [0]*self.s 
     for i in range(self.s): 
      tmp[i] = self.a[i]*that 
     return self.__class__(tmp)  

所以這適用於a * b,b * a,2 * a,但不是* 2!

+0

請回溯? –

+1

只需使用numpy ndarrays。他們已經做了這些東西。 – wim

+0

文件 「」,第1行,在 一個* 2 文件 「C:/Users/Hossein/Documents/R3.py」,第16行,在__mul__ TMP [I ] = self.a [i] * that.a [i] AttributeError:'int'object has no attribute'a' –

回答

3

雙方不能實現__rmul__,因爲根據定義,__rmul__是正確的乘法。當您想要更改x * y的行爲時,您必須查看x.__class__.__mul__y.__class__.__rmul__

  • a * b使用R3.__mul__(OK)
  • b * a還使用R3.__mul__(OK)
  • 2 * a首先使用int.__mul__,失敗,則嘗試R3.__rmul__代替(OK)
  • a * 2使用R3.__mul__,出現故障時,使用int.__rmul__ ,再次失敗(不OK!)

您當前寫入它的方式,__mul__假定that參數是R3實例,並且__rmul__假定that參數是標量。

您不能修改int.__rmul__,以更改最後一種情況的行爲,因爲您無法修補這些內置類型。但是,您可以修改您的R3.__mul__以更改該行爲。

您已實施__mul__以僅處理傳入thatR3實例。修復它,以便它可以處理傳入that的標量。

+0

是的,當先來時,__mul__被調用。我想知道是否有辦法讓所有這些都可以。感謝您總結我的問題。 –

+3

@hosseinsadeghi他**回答**你的問題。 –

+0

非常感謝。你讓它看起來很簡單。 –