Python __add__ 方法示例
语法
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
。
上一篇: 如何转换 python 变量类型
推荐阅读
-
python 机器人编程 - 使用 python API 调用控制 wifi 小车的示例程序
-
C# II 中的多态性应用说明示例(使用隐藏方法)
-
Python3 标准库概述和示例
-
Javascript 标准内置对象 布尔值_基础介绍_布尔值 构造函数_to-String 示例方法_valueOf 示例方法
-
STM32 HAL 库 UART 查询方法示例
-
Python 实践 4:输入年份并确定其是否为闰年 - 要求方法:
-
Python+Matplotlib 奇偶函数可视化的简单示例 - 奇异函数 定义:如果对于定义域中的任意 x,存在 f(-x) = -f(x),则称 f(x) 为奇异函数。奇函数的特征奇函数的图象与原点对称。
-
Python+Matplotlib 显示通用函数、变换和函数的简单示例
-
[机器学习] - 线性回归(自我监督学习) - 10.示例代码(Python 实现)
-
lstm 预测预报算法的 python 实现 - lstm 预测预报算法的 python 实现示例