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

重写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:11:18