Python的标准运算符列表包括__add__(a, b)
和__concat__(a, b)
。它们通常都由a + b
调用。我的问题是,它们之间有什么区别?是否存在使用一个而不是另一个的情况?你有什么理由在一个对象上定义它们吗?
这是documentation我找到了提到的方法。
编辑:添加到这个奇怪的是documentation:
最后,序列类型应该通过定义方法
__add__()
,__radd__()
,__iadd__()
,__mul__()
,{{来实现加法(意思是连接)和乘法(意思是重复)。 1}}和__rmul__()
如下所述;他们不应该定义__imul__()
或其他数字运算符。
答案 0 :(得分:10)
如果您检查operator
模块(add,concat)的来源,您会找到这些功能的这些定义:
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在大多数情况下并不是那么有用。当您需要传递执行操作的函数(例如map
,filter
或reduce
等功能函数时,主要使用该模块。但通常情况下,您可以直接使用+
运算符。
至于下划线功能(__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 + b
,a
和b
数字 *。operator.__concat__(a, b)
:对a + b
和a
序列返回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'