Python中Student类内定义列表属性并调用遇self未定义错误如何解决
问题修正与实现方案
核心错误点
- 缩进错误:类定义下的
__init__、register方法没有正确缩进,不属于Student类的成员 - 实例方法缺失self参数:Python类的实例方法第一个参数必须是
self,指代当前实例对象,你写的register()没有加self参数,所以方法内部无法访问self,自然报NameError: name 'self' is not defined Classes taken属性存储逻辑错误:你原本往列表里追加Student实例不符合需求,应该把每门课的课程号、学期、成绩三个信息打包后存入列表- 初始化参数冗余:
__init__里的ClassNumber、Semester、Grade是选课阶段才录入的信息,不需要作为学生实例初始化的参数 - 实例调用逻辑错误:不能直接用类调用
register方法,需要先实例化Student对象,再调用对象的register方法
正确实现代码
class Student(object): def __init__(self, student_number): # 初始化学生仅需传入学号,选课记录初始为空列表 self.student_number = student_number # Classes taken属性用列表存储,每个元素存单门课的三类信息 self.class_taken = [] def register(self): # 实例方法第一个参数必须加self class_number = input('Enter ClassNumber: ') semester = input('Enter Semester: ') grade = input('Enter Grade: ') # 把当前课程信息打包成字典追加到选课列表,可读性更高 self.class_taken.append({ "课程号": class_number, "修读学期": semester, "成绩": grade }) print("选课记录添加成功,当前选课列表:", self.class_taken) # 先实例化学生对象,示例学号为2024001 student1 = Student(student_number="2024001") # 调用学生实例的选课方法 student1.register() # 直接调用属性即可查看所有选课记录 print(student1.class_taken)
补充说明
- 如果要提取某门课的信息,直接用列表索引即可,比如
student1.class_taken[0]["课程号"]就能拿到第一条选课记录的课程号 - 你也可以用元组代替字典存储单门课信息,格式为
(class_number, semester, grade),写入逻辑改成self.class_taken.append((class_number, semester, grade))即可,不过字典的可读性更高更推荐使用
内容的提问来源于stack exchange,提问作者Omika Mishra
相关产品推荐
相关产品推荐

