#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))
完美无缺
我想知道原因,以及如何解决这个问题
P.S。抱歉,如果我的英语不好:)
答案 0 :(得分: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)
答案 1 :(得分: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)