如何修复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
修正说明
- 把
__add__、__sub__、__mul__里的返回字符串逻辑改成返回Point实例,传入计算后的x、y值 - 去掉了这三个方法里多余的
print语句——因为打印实例时会自动调用__str__方法,已经能输出指定格式的内容 __eq__方法简化成直接返回判断结果,逻辑和之前一致
这样修改后,不仅能解决当前的错误,还能让Point类的运算符合面向对象的预期——比如你可以继续对point_three进行+ point_one这类操作,不会再出现属性错误。
内容的提问来源于stack exchange,提问作者Mir Ahmed Abbas Khan
相关产品推荐
相关产品推荐

