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

如何将读取学生TXT数据的重复代码移入Python类的__init__方法

问题分析与修正方案

先理清楚你代码里的几个关键错误:

  1. __init__方法的文件读取逻辑错误
    你在打开文件后先调用了datafile.read(),这会把文件指针移动到文件末尾,后面的for line in datafile根本读不到任何内容,导致self.students一直是空列表。而且你既把参数data传给open,又给self.data赋值固定文件名,逻辑冗余,没必要。另外self.datum完全不需要设为实例属性,用局部变量就行。

  2. SearchStudent方法的逻辑错误
    你写的if self == ('byId')完全不成立,self是Student类的实例,不可能等于字符串。应该把搜索方式作为方法参数传进来,而不是拿实例和字符串比。还有循环里的self.datum也没必要,用局部变量更合理。

  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:35:21