如何将读取学生TXT数据的重复代码移入Python类的__init__方法
问题分析与修正方案
先理清楚你代码里的几个关键错误:
__init__方法的文件读取逻辑错误
你在打开文件后先调用了datafile.read(),这会把文件指针移动到文件末尾,后面的for line in datafile根本读不到任何内容,导致self.students一直是空列表。而且你既把参数data传给open,又给self.data赋值固定文件名,逻辑冗余,没必要。另外self.datum完全不需要设为实例属性,用局部变量就行。SearchStudent方法的逻辑错误
你写的if self == ('byId')完全不成立,self是Student类的实例,不可能等于字符串。应该把搜索方式作为方法参数传进来,而不是拿实例和字符串比。还有循环里的self.datum也没必要,用局部变量更合理。AttributeError的根源
这个错误说明你调用方法时搞错了对象——你大概率是直接用字符串去调用方法,或者没有先创建类的实例就调用了方法。比如错误写了Student.SearchStudent('byId'),正确的做法是先创建实例,再调用实例的方法。
修正后的完整代码:
class Student(): def __init__(self, data_file="studentMockData_AS2.txt"): self.data_file = data_file self.students = [] # 正确读取文件内容,不提前调用read() with open(self.data_file, 'r') as datafile: for line in datafile: # 用局部变量datum,不用实例属性 datum = line.strip().split() # 跳过空行 if datum: self.students.append(datum) def searchStudent(self, search_type): if search_type == 'byId': search_id = input('Enter student id: ') # 用局部变量遍历,不修改实例属性 for datum in self.students: if datum[0] == search_id: print(datum) # 可以在这里补充其他搜索类型的逻辑,比如byName elif search_type == 'byName': search_name = input('Enter student name: ') for datum in self.students: # 假设第二个元素是姓名,根据你的数据格式调整 if datum[1] == search_name: print(datum) # 这里可以补充你的addStudent、showStudent、deleteStudent方法 def showStudent(self): for student in self.students: print(student) # 正确的使用方式 if __name__ == "__main__": # 创建Student实例,默认读取指定文件 student_manager = Student() # 调用搜索方法,传入搜索类型 student_manager.searchStudent('byId') # 调用展示方法 student_manager.showStudent()
关键说明:
- 把文件读取逻辑完全放到__init__里,实例创建时就一次性加载所有学生数据,后续方法直接用
self.students即可,避免重复代码。 - 所有方法里尽量用局部变量,不要随意给实例属性赋值(除非需要在多个方法间共享)。
- 必须先创建类的实例(比如
student_manager = Student()),再通过实例调用方法,不能直接用类或者字符串去调用实例方法。
内容的提问来源于stack exchange,提问作者paparonnie
相关产品推荐
相关产品推荐

