2015-06-18 80 views
8

Python的標準運算符列表包括__add__(a, b)__concat__(a, b)。他們通常都是由a + b調用的。我的問題是,他們之間有什麼區別?有沒有一種情況會使用而不是另一種?您是否有任何理由在一個對象上定義這兩個對象?Python的__add__和__concat__有什麼區別?

這是我發現中提到的方法documentation

編輯:添加到怪事是這樣documentation

最後,序列類型應該實現除(意爲串聯)和乘法(意爲重複)通過定義如下所述的方法__add__(),__radd__(),__iadd__(),__mul__(),__rmul__()__imul__();他們不應該定義__coerce__()或其他數值運算符。

+0

那麼根據您鏈接到一個文檔是數字和一個用於序列 – Craicerjack

+2

注意'__concat__'不是*「魔術方法」 *像'__add__'是:https://開頭的文檔.python.org/2/reference/datamodel.html – jonrsharpe

+0

*是否有區別,名稱除外? – user2864740

回答

7

如果你檢查的operator模塊(addconcat)源代碼,你會發現這些函數的定義:

def add(a, b): 
    "Same as a + b." 
    return a + b 

def concat(a, b): 
    "Same as a + b, for a and b sequences." 
    if not hasattr(a, '__getitem__'): 
     msg = "'%s' object can't be concatenated" % type(a).__name__ 
     raise TypeError(msg) 
    return a + b 

因此,實際上有不同之處在於concat沒有區別實際上需要一個序列類型。這兩個函數都使用+運算符,其效果取決於您添加的類型。

一般來說,在大多數情況下使用operator module並不是那麼有用。當您需要將執行操作的功能(例如,功能功能如mapfilterreduce)傳遞給模塊時,通常會使用該模塊。但通常,您可以直接使用+運算符。

至於下劃線函數(__add____concat__),這些是just aliases

__add__ = add 
__concat__ = concat 

但這些當然不相關的用於重載操作自定義類型的special methods。它們是與這些特殊方法相同名稱的函數,可能會使它們顯得相似。請注意,對象上沒有特殊的__concat__方法。

上的自定義類型實現__add__但將影響到運營商模塊功能的工作,例如:

>>> class Example: 
     def __init__ (self, x): 
      self.x = x 
     def __repr__ (self): 
      return 'Example({})'.format(self.x) 
     def __add__ (self, other): 
      return Example(self.x + other.x) 

>>> a = Example(2) 
>>> b = Example(4) 
>>> operator.add(a, b) 
Example(6) 
>>> a + b 
Example(6) 

正如你所看到的,operator.add將使用特殊的方法Example.__add__的執行情況;但其原因在於operator.add的實現僅使用+運算符(該行爲由特殊的__add__方法明確定義)。

+0

好吧,'operator'模塊對於將操作符傳遞給'reduce ()' – fferri

+1

@mescalinum這就是我寫的:*「該模塊主要用於需要傳遞執行操作的函數。」* – poke

+0

好的。我只是喜歡提及'reduce()',因爲函數式編程非常酷:) – fferri

3
  • operator.__add__(a, b):返回a + b,爲ab *。
  • operator.__concat__(a, b):返回a + bab序列

有什麼區別?

例如,你不能連接整數:

>>> operator.__concat__(2,3) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: 'int' object can't be concatenated 

  • 實際上__add__(a, b)少了點a + b,因此它適用於序列了。
0

作爲每文檔,

operator.__add__(a, b)返回A + B,A和B的數字。

operator.__concat__(a, b)返回a和b序列的a + b。

操作.__添加__(A,B):

它只是將嘗試執行a + b並給出結果。

例如,

operator.__add__(1,2) # performs 1 + 2 
3 

operator.__add__('a','b') # performs 'a'+'b' 
'ab' 

操作.__ CONCAT __(A,B):

在這裏,它會檢查是否有a屬性__getitem__。如果它沒有__getitem__屬性,則會引發異常,否則請嘗試執行a + b

例如,

對數字執行此操作時,會引發異常。

operator.__concat__(1,2) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError:'int' object can't be concatenated 

當執行兩個字符串時,它執行字符串連接。

operator.__concat__('a','b') 
'ab' 
+0

行爲*實際*不同/限制? 'operator.add(「a」,「b」)'產生期望的結果('「a」+「b」=>「ab」')並且文檔說「Return a + b」。 – user2864740

+0

請注意,OP在談論「操作員」模塊,而不是特殊的方法。還要注意,沒有特殊的'__concat__'方法。 – poke

+0

更新了答案。 –