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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:15:02