首页 > 解决方案 > 求和重载

问题描述

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

标签: pythonclassoperator-overloading

解决方案


您正在返回一个元组,该元组没有__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)(您可以在代码中省略括号,而且它更像 Python,但它是等价的,它实际上是一个元组)。

元组是一个固定长度的元素列表,它是 Python 语言的基本类。你可以在这里阅读更多关于它的信息。

的结果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>.


推荐阅读