Python的__add__和__concat__有什么区别?

时间:2015-06-18 19:51:31

标签: python operators

Python的标准运算符列表包括__add__(a, b)__concat__(a, b)。它们通常都由a + b调用。我的问题是,它们之间有什么区别?是否存在使用一个而不是另一个的情况?你有什么理由在一个对象上定义它们吗?

这是documentation我找到了提到的方法。

编辑:添加到这个奇怪的是documentation

  

最后,序列类型应该通过定义方法__add__()__radd__()__iadd__()__mul__(),{{来实现加法(意思是连接)和乘法(意思是重复)。 1}}和__rmul__()如下所述;他们不应该定义__imul__()或其他数字运算符。

3 个答案:

答案 0 :(得分:10)

如果您检查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__方法明确定义)。

答案 1 :(得分:3)

  • operator.__add__(a, b):返回a + bab 数字 *。
  • operator.__concat__(a, b):对a + ba 序列返回b

有什么区别?

例如,您无法连接整数:

>>> 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,因此它也适用于序列。

答案 2 :(得分:0)

根据文档,

  

operator.__add__(a, b)返回a + b,表示a和b数字。

     

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

运营商.__添加__(a,b):

它只会尝试执行a + b并给出结果。

例如

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

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

operator .__ 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'