因此,我最近学习了python中的运算符重载,并尝试在我正在进行的项目中使用它。贝娄,我试图重现我遇到的问题
class Ship:
def __init__(self, pos):
self.pos = pos
self.center = [18, 30]
self.leftNozzlePos = [6, 10]
self.rightNozzlePos = [30, 10]
self.mainNozzlePos = [18, 60]
def __add__(p1, p2):
x = p1[0] + p2[0]
y = p1[1] + p2[1]
return [x, y]
def updateRelativePositions(self):
self.center = self.pos + self.center
self.leftNozzlePos = self.pos + self.leftNozzlePos
self.rightNozzlePos = self.pos + self.rightNozzlePos
self.leftNozzlePos = self.pos + self.mainNozzlePos
ship = Ship([600, 300])
ship.updateRelativePositions()
print(ship.mainNozzlePos)
所以我有一堆位置值存储在一个列表中[x, y]
。我试图重载__add__
运算符,使其返回[p1[0]+p2[0], p1[1]+p2[1]]
,其中p1
和p1
是两个不同的列表,它们保持着不同的位置。我尝试添加一些位置值,正如您在函数updateRelativePositions
中看到的,结果很奇怪。对于leftNozzlePos
和rightNozzlePos
它打印一个包含4项的列表,对于mainNozzlePos
它返回完全不变的值。为什么会发生这种情况,我该如何解决?谢谢你的帮助
__add__
在添加实例本身时适用(例如,执行ship + ship
或其他操作);不是这样,而是在添加实例的随机属性(当涉及list
时,这会导致连接)mainNozzlePos
未更改的原因是您意外地将其分配给了leftNozzlePos
(覆盖了前面两行计算的值)运算符重载在这里没有意义,因为您不想支持将一个
Ship
添加到另一个(这意味着什么?)。您可以为您的成员变量使用numpy
数组,当调用+
时,它将执行元素级加法而不是串联,或者您可以只使用一个简单的helper方法来显式执行您试图执行的操作,例如或者,您可以定义:
并避免在每次调用时显式传递
self.pos
(代价是使函数只向对象添加self.pos
,而不是任意点),并且在结束时需要重新分配,使调用简化为:相关问题 更多 >
编程相关推荐