__add_u运算符重载无法按预期工作

2024-10-01 02:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我最近学习了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]],其中p1p1是两个不同的列表,它们保持着不同的位置。我尝试添加一些位置值,正如您在函数updateRelativePositions中看到的,结果很奇怪。对于leftNozzlePosrightNozzlePos它打印一个包含4项的列表,对于mainNozzlePos它返回完全不变的值。为什么会发生这种情况,我该如何解决?谢谢你的帮助


Tags: posselfadd列表def运算符centerp2
1条回答
网友
1楼 · 发布于 2024-10-01 02:21:30

__add__在添加实例本身时适用(例如,执行ship + ship或其他操作);不是这样,而是在添加实例的随机属性(当涉及list时,这会导致连接)

mainNozzlePos未更改的原因是您意外地将其分配给了leftNozzlePos(覆盖了前面两行计算的值)

运算符重载在这里没有意义,因为您不想支持将一个Ship添加到另一个(这意味着什么?)。您可以为您的成员变量使用numpy数组,当调用+时,它将执行元素级加法而不是串联,或者您可以只使用一个简单的helper方法来显式执行您试图执行的操作,例如

class Ship:
    # __init__ omitted for brevity

    @staticmethod
    def _addpoints(p1, p2):
        x = p1[0] + p2[0]
        y = p1[1] + p2[1]
        return [x, y]

    def updateRelativePositions(self):
        self.center = self._addpoints(self.pos, self.center)
        self.leftNozzlePos = self._addpoints(self.pos, self.leftNozzlePos)
        self.rightNozzlePos = self._addpoints(self.pos, self.rightNozzlePos)
        self.mainNozzlePos = self._addpoints(self.pos, self.mainNozzlePos)

或者,您可以定义:

    def _addpos(self, pt):
        pt[0] += self.pos[0]
        pt[1] += self.pos[1]

并避免在每次调用时显式传递self.pos(代价是使函数只向对象添加self.pos,而不是任意点),并且在结束时需要重新分配,使调用简化为:

    def updateRelativePositions(self):
        self._addpos(self.center)
        self._addpos(self.leftNozzlePos)
        self._addpos(self.rightNozzlePos)
        self._addpos(self.mainNozzlePos)

相关问题 更多 >