You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Python Point类中__add__等方法的AttributeError错误?

修复Point类运算方法的AttributeError错误

你遇到的AttributeError: 'str' object has no attribute 'x'错误,根源在于你的__add__、__sub__、__mul__方法返回的是字符串,而不是Point类的实例。

按照Python魔法方法的设计规范,这类二元运算方法应该返回同类型的对象(也就是Point实例),而不是直接返回格式化后的字符串。如果返回字符串,后续如果对运算结果(比如point_three)再次进行Point类的运算操作时,就会把字符串当作other参数传入,自然就会出现找不到x属性的错误——哪怕当前测试代码里没做后续运算,这种写法也不符合面向对象的设计逻辑。

修正后的代码

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

    def __str__(self):
        return_string = "Instance of Point\n\n"
        return_string += f"x: {self.x}\ny: {self.y}"
        return return_string

    def __add__(self, other):
        # 返回新的Point实例,而不是字符串
        return Point(self.x + other.x, self.y + other.y)

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

    def __mul__(self, other):
        return Point(self.x * other.x, self.y * other.y)

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    """ A simple representation of a point in 2d space"""


if __name__ == "__main__":
    point_one = Point(3,2)
    print(point_one)
    print()
    point_two = Point(5,3)
    print(point_two)
    print()
    point_three = point_one + point_two
    print(point_three)
    print()
    point_four = point_one - point_two
    print(point_four)
    print()
    point_five = point_one * point_two
    print(point_five)
    print()
    print(point_one == point_two) # prints False

修正说明

  1. 把__add__、__sub__、__mul__里的返回字符串逻辑改成返回Point实例,传入计算后的x、y值
  2. 去掉了这三个方法里多余的print语句——因为打印实例时会自动调用__str__方法,已经能输出指定格式的内容
  3. __eq__方法简化成直接返回判断结果,逻辑和之前一致

这样修改后,不仅能解决当前的错误,还能让Point类的运算符合面向对象的预期——比如你可以继续对point_three进行+ point_one这类操作,不会再出现属性错误。

内容的提问来源于stack exchange,提问作者Mir Ahmed Abbas Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:35:49