What is the difference between Python's __add__ and __concat__?
python的标准操作符列表包括
这是我在中找到方法的文档。
编辑:增加了奇怪的是,这是文件:
Finally, sequence types should implement addition (meaning concatenation) and multiplication (meaning repetition) by defining the methods
__add__() ,__radd__() ,__iadd__() ,__mul__() ,__rmul__() and__imul__() described below; they should not define__coerce__() or other numerical operators.
如果您检查
1 2 3 4 5 6 7 8 9 10 | 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 |
所以除了
一般来说,使用
对于下划线函数(
1 2 | __add__ = add __concat__ = concat |
但这些当然与用于重载自定义类型的运算符的特殊方法无关。它们是与那些特殊方法同名的函数,可能是为了使它们看起来相似。但请注意,对象上没有特殊的
但是,在自定义类型上实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> 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__(a, b) :返回a + b ,用于a 和b 号*。operator.__concat__(a, b) :返回a 和b 序列的a + b 。
有什么区别?
例如,不能连接整数:
1 2 3 4 | >>> 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 ,因此它也在序列上工作。
根据文件,
operator.__add__(a, b) Return a + b, for a and b numbers.
operator.__concat__(a, b) Return a + b for a and b sequences.
接线员。添加(A,B):
它只会尝试执行
如。
1 2 3 4 5 | operator.__add__(1,2) # performs 1 + 2 3 operator.__add__('a','b') # performs 'a'+'b' 'ab' |
接线员uu concat_uuuuu(a,b):
在这里,它将检查
如。
在对数字执行此操作时,将引发异常。
1 2 3 4 | operator.__concat__(1,2) Traceback (most recent call last): File"<input>", line 1, in <module> TypeError:'int' object can't be concatenated |
当对两个字符串执行时,它执行字符串串联。
1 2 | operator.__concat__('a','b') 'ab' |