如果您检查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实际上需要一个序列类型。这两个函数都使用+运算符,其效果取决于添加的类型。在
一般来说,使用^{} module在大多数情况下都没有那么有用。该模块主要用于需要传递执行操作的函数时,例如传递给^{}、^{}或{a6}等函数。但是通常,您可以直接使用+运算符。在
至于下划线函数(__add__和__concat__),它们是just aliases:
^{pr2}$
但这些当然与用于重载自定义类型运算符的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__方法明确定义)。在