欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Python __add__ 方法示例

最编程 2024-05-26 16:18:43
...

语法

object.__add__(self, other)

Python的object.__add__(self, other) 方法返回一个新对象,代表两个对象的总和。它实现了Python中的加法运算符 +

我们称它为*"* Dunder方法",意思是*" 下划线方法"(也叫"魔法方法")*。

例子

在下面的例子中,你创建了一个自定义类Data ,并覆盖了__add__() 方法,从而创建了一个新的Data 对象,其值是两个操作数ab 的值之和,类型为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方法,该方法接收两个参数:selfother ,并返回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_basketyour_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