重写Matrix类__add__方法时self与other实例值相同的问题
问题分析与解决
嘿,你遇到的这个问题根源其实很明显——不该给__add__方法加@classmethod装饰器!
为啥self和other输出会一样?
在Python里,__add__是用来重载+运算符的实例方法,它的第一个参数self本来应该指代当前的Matrix实例,第二个参数other是要相加的另一个Matrix实例。但你加了@classmethod之后,self就变成了Matrix类本身,而不是具体的实例。这时候你访问self._data,其实是在拿类的属性(如果有的话),而不是实例的私有数据,逻辑直接乱掉,自然会出现输出异常的情况。
修正后的代码
把那个多余的@classmethod去掉,让方法回到实例方法的正确形态,再补充一些必要的检查:
def __add__(self, other): # 先检查是否是同类型实例 if not isinstance(other, Matrix): return NotImplemented # 打印实例数据确认 print(self._data) print(other._data) # 检查矩阵维度是否一致,避免报错 row_count = len(self._data) col_count = len(self._data[0]) if len(other._data) != row_count or len(other._data[0]) != col_count: raise ValueError("只有同维度的矩阵才能相加哦") # 初始化结果矩阵 addition = [[0 for _ in range(col_count)] for _ in range(row_count)] # 逐元素相加 for i in range(row_count): for j in range(col_count): addition[i][j] = self._data[i][j] + other._data[i][j] return Matrix(addition)
几个关键细节提醒
- 所有运算符重载的特殊方法(比如
__add__、__sub__、__mul__)都得是实例方法,绝对不能用类方法或静态方法修饰,不然Python的运算符机制就没法正常工作了。 - 加上类型检查和维度检查很重要,能避免很多莫名其妙的错误,也能给使用者更清晰的报错信息。
- 你原来代码里的
addition[i][j] += ...其实没必要,因为列表推导式已经把每个元素初始成0了,直接赋值就行。
内容的提问来源于stack exchange,提问作者a_new_erro
相关产品推荐
相关产品推荐

