求和重载

时间:2018-11-18 20:22:53

标签: python class operator-overloading

我想要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)

1 个答案:

答案 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>