语法
object.__add__(self, other)
Python的object.__add__(self, other) 方法返回一个新对象,代表两个对象的总和。它实现了Python中的加法运算符 + 。
我们称它为*"* Dunder方法",意思是*"双 下划线方法"(也叫"魔法方法")*。
例子
在下面的例子中,你创建了一个自定义类Data ,并覆盖了__add__() 方法,从而创建了一个新的Data 对象,其值是两个操作数a 和b 的值之和,类型为Data 。
class Data:
def __init__(self, value):
self.value = value
def __add__(self, other):
return Data(self.value + other.value)
a = Data(40)
b = Data(2)
c = a + b
print(c.value)
# 42
你已经定义了dunder方法,所以产生的两个Data 对象的和本身就是一个Data 对象。
print(type(c))
# <class '__main__.Data'>
如果你没有定义__add__() 方法,Python 会提出一个TypeError 。
如何解决TypeError:+的操作数类型不受支持
考虑下面的代码片段,你试图在没有定义dunder方法的情况下添加两个自定义对象__add__() 。
class Data:
def __init__(self, value):
self.value = value
a = Data(40)
b = Data(2)
c = a + b
print(c.value)
在我的电脑上运行这个导致了以下错误信息。
Traceback (most recent call last):
File "C:\Users\xcent\Desktop\code.py", line 11, in <module>
print(a + b)
TypeError: unsupported operand type(s) for +: 'Data' and 'Data'
这个错误的原因是,__add__() dunder方法从未被定义过,而且默认情况下没有为自定义对象定义该方法。因此,为了解决TypeError: unsupported operand type(s) for + ,你需要在你的类定义中提供__add__(self, other) 方法,如前所示。
class Data:
def __init__(self, value):
self.value = value
def __add__(self, other):
return Data(self.value + other.value)
在自定义类中添加列表的高级示例
要在自定义对象上使用加法运算符,你需要定义__add__() dunder方法,该方法接收两个参数:self 和other ,并返回self + other 的结果。要获得自定义对象的结果,你可以使用该对象中维护的属性(数据)。
在下面的代码中,你通过合并两个篮子的内容把它们加在一起。
class Basket:
def __init__(self, contents):
self.contents = contents
def __add__(self, other):
return Basket(self.contents + other.contents)
my_basket = Basket(['banana', 'apple', 'juice'])
your_basket = Basket(['bred', 'butter'])
our_basket = my_basket + your_basket
print(our_basket.contents)
这个代码片断的输出是合并后的篮子。
['banana', 'apple', 'juice', 'bred', 'butter']
该代码由以下步骤组成。
- 创建持有列表内容的类
Basket,以存储一些货物。 - 定义神奇的方法
__add__,通过合并两个操作数篮子中的商品列表(contents),创建一个新的篮子。注意,我们依靠已经实现的列表上的加法运算,即 列表连接,来实际实现篮子的加法运算。 - 我们创建了两个篮子
my_basket和your_basket,并使用定义的加法运算将它们加到一个新的篮子our_basket。
Python的__add__与__iadd__比较
Python提供了操作符x += y ,通过计算总和x + y ,并将结果分配给第一个操作数的变量名x ,从而将两个对象就地相加 。你可以通过在你的类定义中覆盖神奇的 "dunder "方法__iadd__(self, other) ,为你自己的类设置就地加法行为。
>>> x = 1
>>> x += 2
>>> x
3
表达式x += y 是较长形式的x = x + y 的语法糖。
>>> x = 1
>>> x = x + 2
>>> x
3
所以,这里是 Python__add__ 和 Python__iadd__ 的区别。
如果你覆盖了__add__ 魔法,你将定义简单的 Python 加法的语义x + y 。如果你覆盖了__iadd__ 魔法方法,你将定义原地 Python 加法的语义,x += y 改变原始对象x 。