Python代码出现AttributeError:'builtin_function_or_method'无split属性求助
Python矩阵类代码报错排查与修复
问题代码
class SquareMatrix: def __init__(self, order): self.order = order self.rows = [ [0 for j in range(order)] for i in range(order)] def __str__(self): x = '' for row in self.rows: x = x + ' '.join(map(str, row))+'\n' return x def set_value(self, i, j, value): self.rows[i][j] = value def get_value(self, i, j): self.rows[i][j] def max(self): tomliste = [] for i in self.rows: for num in i: tomliste.append(num) tomliste.sort() return tomliste[-1] def min(self): tomliste = [] for i in self.rows: for num in i: tomliste.append(num) tomliste.sort() return tomliste[0] def trace(self): counter = 0 for i in range(self.order): counter = counter + int(self.rows[i][i]) return counter def summary(self): lib = {(f'order : {self.order}, max : {self.max()}, min : {self.min()}, trace : {self.trace()}')} return lib def save(self, filename): f = open(filename, "w") f.write(str(self)) f.close() @classmethod def parse(cls, text): liste = [] for line in text.split('\n'): liste.append(line.split()) matrix = SquareMatrix(len(liste[1])) for i, line in enumerate(liste): matrix.rows[i] = line return matrix @classmethod def load(cls, filename): y = open(filename, 'r') y = y.read y = SquareMatrix.parse(y) return y m1 = SquareMatrix(3) m1.set_value(1,1,7) m1.get_value(2, 1) print("--m1--") print(m1) print(m1.summary()) m2_text = """\ 1 2 3 4 5 6 7 8 9""" print("--m2--") m2 = SquareMatrix.parse(m2_text) print(m2) print(m2.summary()) m2.save("m3.txt") print("--m3--") m3 = SquareMatrix.load('m1.txt') print(m3) print(m3.summary())
报错信息
AttributeError: 'builtin_function_or_method' object has no attribute 'split'
报错堆栈
File "c:\Users\marle\Documents\INFO132\maped6868_hoved2.py", line 96, in m3 = SquareMatrix.load('m1.txt') File "c:\Users\marle\Documents\INFO132\maped6868_hoved2.py", line 72, in load y = SquareMatrix.parse(y) File "c:\Users\marle\Documents\INFO132\maped6868_hoved2.py", line 58, in parse for line in text.split('\n'): AttributeError: 'builtin_function_or_method' object has no attribute 'split'
预期输出
--m1-- 1 0 0 0 1 0 0 0 1 {'order': 3, 'max': 1, 'min': 0, 'trace': 3} --m2-- 1 2 3 4 5 6 7 8 9 {'order': 3, 'max': 9, 'min': 1, 'trace': 15} --m3-- 1 2 3 4 5 6 7 8 9 {'order': 3, 'max': 9, 'min': 1, 'trace': 15}
问题分析与修复
1. 核心报错原因(load方法)
load方法中y = y.read未加括号,赋值的是文件对象的read方法本身,而非调用方法读取的文本内容。传递给parse的是函数对象,自然没有split方法,触发报错。
修复:调用read()方法读取内容,同时用with语句自动管理文件关闭:
@classmethod def load(cls, filename): with open(filename, 'r') as f: content = f.read() return cls.parse(content)
2. 其他不符合预期的问题修复
get_value无返回值:原方法仅访问矩阵元素但未返回,调用后无法获取结果。
修复:def get_value(self, i, j): return self.rows[i][j]summary返回集合而非字典:原代码用
{...}创建集合,与预期的字典输出不符。
修复:def summary(self): return { 'order': self.order, 'max': self.max(), 'min': self.min(), 'trace': self.trace() }__init__初始化全0矩阵,不符合预期单位矩阵:预期m1是单位矩阵,需将对角线元素设为1。
修复:def __init__(self, order): self.order = order self.rows = [] for i in range(order): row = [0]*order row[i] = 1 self.rows.append(row)parse方法阶数计算错误+未转整数:原代码用
len(liste[1])可能因空行报错,且未将字符串元素转为整数。
修复:@classmethod def parse(cls, text): liste = [] for line in text.split('\n'): stripped_line = line.strip() if stripped_line: # 过滤空行 liste.append(stripped_line.split()) if not liste: raise ValueError("Invalid matrix text") order = len(liste[0]) matrix = cls(order) for i, line in enumerate(liste): matrix.rows[i] = [int(num) for num in line] return matrixload方法文件名错误:原代码加载
m1.txt,但之前保存的是m3.txt,需修正文件名。
修复:m3 = SquareMatrix.load('m3.txt')
完整修复后代码
class SquareMatrix: def __init__(self, order): self.order = order self.rows = [] for i in range(order): row = [0] * order row[i] = 1 self.rows.append(row) def __str__(self): x = '' for row in self.rows: x += ' '.join(map(str, row)) + '\n' return x def set_value(self, i, j, value): self.rows[i][j] = value def get_value(self, i, j): return self.rows[i][j] def max(self): tomliste = [] for row in self.rows: tomliste.extend(row) return max(tomliste) def min(self): tomliste = [] for row in self.rows: tomliste.extend(row) return min(tomliste) def trace(self): counter = 0 for i in range(self.order): counter += self.rows[i][i] return counter def summary(self): return { 'order': self.order, 'max': self.max(), 'min': self.min(), 'trace': self.trace() } def save(self, filename): with open(filename, "w") as f: f.write(str(self)) @classmethod def parse(cls, text): liste = [] for line in text.split('\n'): stripped_line = line.strip() if stripped_line: liste.append(stripped_line.split()) if not liste: raise ValueError("Invalid matrix text input") order = len(liste[0]) matrix = cls(order) for i, line in enumerate(liste): matrix.rows[i] = [int(num) for num in line] return matrix @classmethod def load(cls, filename): with open(filename, 'r') as f: content = f.read() return cls.parse(content) m1 = SquareMatrix(3) m1.get_value(2, 1) print("--m1--") print(m1) print(m1.summary()) m2_text = """\ 1 2 3 4 5 6 7 8 9""" print("--m2--") m2 = SquareMatrix.parse(m2_text) print(m2) print(m2.summary()) m2.save("m3.txt") print("--m3--") m3 = SquareMatrix.load('m3.txt') print(m3) print(m3.summary())
内容的提问来源于stack exchange,提问作者marlene
相关产品推荐
相关产品推荐

