8
#it's python 3.2.3
class point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, point):
        self.x += point.x
        self.y += point.y
        return self

    def __repr__(self):
        return 'point(%s, %s)' % (self.x, self.y)

class Test:
    def __init__(self):
        self.test1 = [point(0, i) for i in range(-1, -5, -1)]
        self.test2 = [point(i, 0) for i in range(-1, -5, -1)]

        print('%s\n+\n%s\n=\n%s' % (self.test1[0], self.test2[0], self.test1[0] + self.test2[0]))

test = Test()
input()

这个程序的输出是

point(-1, -1)
+
point(-1, 0)
=
point(-1, -1)

但应该是

point(-1, -1)
+
point(-1, 0)
=
point(-2, -1)

但如果我这样做

print(point(-1, -1) + point(-1, 0))

它完美地工作

我想知道为什么,以及如何解决这个问题

ps对不起,如果我的英语不好:)

4

2 回答 2

17

您的__add__函数将左侧参数修改为+. 例如:

>>> x = point(0, 0)

>>> x + point(1, 1)
point(1, 1)

>>> x
point(1, 1)

你应该变成__add__

def __add__(self, oth):
    return point(self.x + oth.x, self.y + oth.y)
于 2012-05-23T15:17:13.157 回答
3

你说输出应该是:

point(-1, -1)
+
point(-1, 0)
=
point(-2, -1)

实际上应该是:

point(0, -1)
+
point(-1, 0)
=
point(-1, -1)

因为您正在创建第一个点[point(0, i) for i in range(-1, -5, -1)](注意x参数是0)。

这是(self.test1[0], self.test2[0], self.test1[0] + self.test2[0]))被评估的结果 - 加法修改了该元组中的第一个点(它们是同一个对象)。这也是您的第二个示例正常工作(或看起来)的原因 - 您只打印一次修改后的对象。

您提供的实现__add__适用于__iadd__实现+=运营商。正确的实现应该创建一个全新的point对象:

def __add__(self, oth):
    return point(self.x + oth.x, self.y + oth.y)
于 2012-05-23T15:41:46.610 回答