2015-06-18 94 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

更新了答案。 –