在python中使用类时的计算问题

在python中使用类时的计算问题,python,Python,我想得到这样的答案: def main() : a = Complex(3.0,-4.5) b = Complex(4.0, -5.0) c = Complex(-1.0, 0.5) print(a+b) print(a+b-c) print(a-b) print(a-b+c) print(a-c) print(b == (a-c)) class Complex: def __init__(self, x, y):

我想得到这样的答案:

def main() :
    a = Complex(3.0,-4.5)
    b = Complex(4.0, -5.0)
    c = Complex(-1.0, 0.5)
    print(a+b)
    print(a+b-c)
    print(a-b)
    print(a-b+c)
    print(a-c)
    print(b == (a-c))

class Complex:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Complex(self.x + other.x, self.y + other.y)

    def __sub__(self, other):
        return Complex(self.x - other.x, self.y - other.y)

    def __str__(self):
        return f"Complex({self.x}, {self.y})"

main()

在Complex4.0,-5.0之前一切都很好,但最后我得到了“False”。所以我试着调试,发现在'at'后面的==数字是不同的,所以显示False。我试着把A-c和B都打印出来,打印出来的时候它们看起来是一样的,但像地址之类的东西是不同的。我应该怎么做才能得到正确而不是错误?

一个快速但微弱的解决方案是更改行

printb==a-c 进入

printstrb==stra-c 但是,如果您想实现更简单的平等性检查,您应该检查dunder方法。例如,您可以添加以下方法:

定义自身,其他: 返回self.x,self.y==other.x,other.y
一个快速但脆弱的解决方案是改变路线

printb==a-c 进入

printstrb==stra-c 但是,如果您想实现更简单的平等性检查,您应该检查dunder方法。例如,您可以添加以下方法:

定义自身,其他: 返回self.x,self.y==other.x,other.y
正如在评论中指出的,您尚未定义用于相等比较的_eq_uu运算符==。由于未定义,python不知道如何比较这两个对象,而是尝试比较它们的标识,比如is关键字,它检查它们是否是相同的对象,at后面的地址或数字是否相同

下面是uuu eq的一个实现__


最后的输出应该是True,正如您在评论中指出的那样,您没有定义用于等式比较的_eq_uu运算符==。由于未定义,python不知道如何比较这两个对象,而是尝试比较它们的标识,比如is关键字,它检查它们是否是相同的对象,at后面的地址或数字是否相同

下面是uuu eq的一个实现__


当您的类没有实现_eq__)或任何比较方法时,您应该得到真实的结果。您需要定义一个方法,可能还有其他比较dunders来覆盖默认的对象相等性检查。0x0397处的对象只是内存地址,所以两个对象有不同的地址,这是正常的。另外,请阅读关于为您的对象获得一个可读的打印的文章。您知道Python内置了复杂的数字,对吗?e、 g.a=3+-4.5J您的类没有实现_eq__;或任何比较方法。您需要定义一个方法,可能还需要定义其他比较dunders来覆盖默认的对象相等性检查。0x0397处的对象只是内存地址,因此两个对象具有不同的地址,这是正常的。另外,请阅读关于为您的对象获得一个可读的打印的文章。您知道Python内置了复杂的数字,对吗?e、 g.a=3+-4.5jFloat不应进行相等性比较。改用ε-球准则。真的谢谢!它可以工作,但是我得到了一些小警告,在实现_eq u的同时没有实现_hash u。这是否意味着当我使用eq时,我总是必须使用hash?Float永远不应该被用来比较相等。改用ε-球准则。真的谢谢!它可以工作,但是我得到了一些小警告,在实现eq的同时没有实现hash,这是否意味着当我使用eq时,我总是要使用hash?
Complex(7.0,-9.5)
Complex(8.0,-10.0)
Complex(-1.0,0.5)
Complex(-2.0,1.0)
Complex(4.0,-5.0)
True
def main() :
    a = Complex(3.0,-4.5)
    b = Complex(4.0, -5.0)
    c = Complex(-1.0, 0.5)
    print(a+b)
    print(a+b-c)
    print(a-b)
    print(a-b+c)
    print(a-c)
    print(b == (a-c))

class Complex:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Complex(self.x + other.x, self.y + other.y)

    def __sub__(self, other):
        return Complex(self.x - other.x, self.y - other.y)

    def __str__(self):
        return f"Complex({self.x}, {self.y})"

    #returns True if the two objects are equal
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

main()