矩阵类测试报错:'list'对象无'g'属性问题排查求助
问题分析与解决方案
看起来你踩了面向对象编程里一个很常见的坑——你的inverse()和T()方法返回的是原生list对象,而非Matrix类的实例!这直接导致test.py里的equal函数尝试访问m1.g时,因为m1实际是个普通列表,根本没有g这个属性,所以触发了AttributeError。另外你提到的__rmul__数值乘法逻辑错误也需要一起修正,下面是具体的修复方案:
1. 修正inverse()方法:返回Matrix实例
假设你的inverse()方法内部已经完成了矩阵求逆的计算,得到了二维列表inversed_list,别直接返回这个列表,要用它创建并返回一个Matrix对象:
def inverse(self): # 保留你原来的求逆计算逻辑,得到inversed_list # ... 你的求逆代码 ... # 替换原来的return inversed_list,返回Matrix实例 return Matrix(inversed_list)
2. 修正T()转置方法:返回Matrix实例
转置操作同理,把计算得到的转置列表包装成Matrix实例再返回:
def T(self): # 示例转置逻辑,你可以替换成自己的实现 transposed_list = [list(col) for col in zip(*self.g)] # 替换原来的return transposed_list,返回Matrix实例 return Matrix(transposed_list)
3. 修正__rmul__的数值乘法逻辑
__rmul__是用来处理数值 * 矩阵这种左乘场景的,要确保每个元素都和数值相乘,并且返回Matrix实例,避免逻辑错误:
def __rmul__(self, scalar): # 先校验输入类型,避免非数值相乘的情况 if not isinstance(scalar, (int, float)): raise TypeError("只能与整数或浮点数相乘") # 遍历矩阵的每个元素,和scalar相乘 multiplied_matrix = [[scalar * elem for elem in row] for row in self.g] # 返回新的Matrix实例 return Matrix(multiplied_matrix)
修复后验证
做完上面的修改,再运行test.py时,inverse()和T()返回的都是完整的Matrix实例,equal函数访问m1.g就能正确获取到矩阵的内部列表属性,不会再触发AttributeError。同时__rmul__的数值乘法也能按照预期工作了。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

