2015-04-18 74 views
2

我知道可以創建一個object.__mul__(self, other)方法來啓用兩個對象的自定義乘法。然而,在python文檔所解釋,Python:使自定義對象與/與標準類型相乘

來計算表達式x + y,其中x是具有__add__()方法的類 的實例,x.__add__(y)被調用。

是否有可能以任何方式,以允許以相反的順序自定義乘法/加法的對象,即y + x,其中x是我們可以控制的實例,並y是標準型,例如的浮動?

回答

6

是的,這是可能的。

事實上,它只是在你看到的相同文檔中的半頁內容中解釋。您只需定義一個__rmul__(self, other)方法。

由於文檔說:

這些方法稱爲執行二進制算術運算(+-*/%divmod()pow()**<<>>&^|)與反射(交換)操作數。這些函數僅在左操作數不支持相應操作且操作數具有不同類型時纔會調用。例如,爲了評估表達式x - y,其中是具有__rsub__()方法的類的實例,如果x.__sub__(y)返回NotImplemented,則調用y.__rsub__(x)

所以:

>>> class Thingy(object): 
...  def __mul__(self, other): 
...   print('mul', other) 
...  def __rmul__(self, other): 
...   print('rmul', other) 
>>> thingy = Thingy() 
>>> thingy * 3 
mul 3 
>>> 3 * thingy 
rmul 3 

查看關於子類的注意,如果是相關的;對於內置類型,通常不是。

另外請注意,沒有__rlt__,__req__等,但應用相同的規則;只是反射是您已經定義的__gt____eq__等方法。