我想要3个不同对象的总和,例如:
`2 3 4
2 3 4
2 3 4
6 9 12`the summation must be like this
并试图做到这一点
`
class mymath:
def __init__(self,x,y,z):
self.x=x
self.y=y
self.z=z
def __add__(self,other):
return self.x+other.x, self.y+other.y, self.z+other.z
x=mymath(2,7,6)
y=mymath(4,3,8)
z=mymath(2,4,6)
print(x+y+z)
答案 0 :(得分:2)
您正在返回一个没有重载__add__()
方法的元组。您应该改为返回mymath
对象:
class mymath:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __add__(self, other):
return mymath(self.x + other.x, self.y + other.y, self.z + other.z)
def __str__(self):
return "({}, {}, {})".format(self.x, self.y, self.z)
x = mymath(2, 7, 6)
y = mymath(4, 3, 8)
z = mymath(2, 4, 6)
print(x + y + z) # Result: (8, 14, 20)
编辑:注释后添加的解决方案的说明
每个+
符号都将转换为__add__()
呼叫。在您的示例中,操作x + y + z
实际上正在对__add__()
执行两次调用:x.__add__(y).__add__(z)
。
在表达式中添加括号可能会有所帮助:x + y + z
实际上转换为(x.__add__(y)).__add__(z)
。
该问题发生在第二次调用__add__()
的过程中,因为您的方法返回的是self.x + other.x, self.y + other.y, self.z + other.z
元组的(self.x + other.x, self.y + other.y, self.z + other.z)
(您可以省略代码中的括号,这更像pythonic ,但等效,实际上是一个元组。
元组是元素的固定长度列表,它是python语言的基本类。您可以详细了解here。
x.__add__(y)
的结果是您希望从x + y
获得的总和,但类型为tuple
。在示例中,(6, 10, 14) == (2 + 4, 7 + 3, 6 + 8)
您可以检查此代码是否在运行,但仅打印x + y
print(x + y) # Prints (6, 10, 14)
还有:
print(type(x + y)) # Prints <class 'tuple'>
但是第二个加法失败,因为第一个加法的结果是元组而不是mymath
对象。因此(x + y) + z
实际上是在调用元组的__add__()
方法,该方法存在但具有除您想要的含义之外的其他含义。因此,您得到错误TypeError: can only concatenate tuple (not "mymath") to tuple
请注意,添加两个元组只是将其附加,而不是逐个元素地添加坐标:(1, 2, 3) + (4, 5, 6) ==> (1, 2, 3, 4, 5, 6)
此问题的解决方案是返回mymath
对象作为__add__()
操作的结果,从而可以连接多个添加操作。
我向您的班级添加了__str__()
方法,因为否则打印只显示了班级的默认表示形式,例如<__main__.mymath object at 0x7f8654657390>
。