2012-05-07 206 views
8

的右側的對象我最近了解了運營商在python超載,我想知道如果下面是可能的。運營商在python超載與運營商

考慮如下因素hypothetica /做作類。

class My_Num(object): 
    def __init__(self, val): 
     self.val = val 
    def __add__(self, other_num): 
     if isinstance(other_num, My_Num): 
      return self.val + other_num.val 
     else: 
      return self.val + other_num 

我知道,多數民​​衆贊成上面寫的方式,我可以做這樣的事情

n1 = My_Num(1) 
n2 = My_Num(2) 
n3 = 3 
print n1 + n2 
print n1 + n3 

和那些將達到預期效果。我也知道,它目前寫的方式我不能這樣做

n1 = My_Num(1) 
n2 = 2 
print 2 + n1 

反正有嗎?我知道這個例子是人爲設計的,但是我有一個應用程序,如果我做了操作符重載,那麼它將非常有用,我定義操作符的類可以出現在操作符的右側。這在Python中可能嗎?

回答

9

是的。例如,有__radd__。另外,there are none__le__(),__ge__()等,但正如Joel Cornett正確觀察的那樣,如果您僅定義了__lt__a > bb的功能爲__lt__,該功能提供瞭解決方法。

>>> class My_Num(object): 
...  def __init__(self, val): 
...   self.val = val 
...  def __radd__(self, other_num): 
...   if isinstance(other_num, My_Num): 
...    return self.val + other_num.val 
...   else: 
...    return self.val + other_num 
... 
>>> n1 = My_Num(1) 
>>> n2 = 3 
>>> 
>>> print n2 + n1 
4 
>>> print n1 + n2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'My_Num' and 'int' 

注意,至少在某些情況下,它是合理的,做這樣的事情:

>>> class My_Num(object): 
...  def __init__(self, val): 
...   self.val = val 
...  def __add__(self, other_num): 
...   if isinstance(other_num, My_Num): 
...    return self.val + other_num.val 
...   else: 
...    return self.val + other_num 
...  __radd__ = __add__ 
+0

謝謝。 __radd__是唯一允許這樣做的嗎?我需要爲我的應用程序重載的具體運算符是>>和<<運算符。我只是運氣不好,我想爲這些運營商做這件事? – martega

+0

沒有。你點擊鏈接了嗎?有'__rrshift__',等等。 – senderle

+1

通過控制爲每個班級定義哪些操作員,可以在有限範圍內進行正確的比較。例如,如果A和B僅定義了__lt__, A A將調用屬於小端的方法。 –

1

你必須重載__radd__法(右側添加)。您的功能應與您的__add__方法幾乎相同,例如:

def __radd__(self, other): 
    return self.val + other.val