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

Python中实现Student类包含多个Subject类对象的方法及代码异常排查

Python中Student与Subject类关联及异常修复

一、正确关联Student与Subject类

要让每个Student实例独立拥有多个Subject实例,核心是给每个Student单独维护自己的科目列表:

  • 不要在Student类级别定义共享的科目列表(比如原代码里的sub = []),而是在__init__方法里初始化实例专属的self.sub。
  • 将传入的Subject实例添加到这个专属列表中,确保每个学生的科目数据完全独立。

二、tTotal结果相同的异常分析与修复

异常根源

原代码里的Student类把sub = []定义成了类属性,类属性是所有Student实例共享的资源。创建st1时,4个Subject实例被加到这个共享列表;创建st2时,又追加了4个,此时sub列表共有8个元素。但计算tTotal时,你始终取self.sub[0]到self.sub[3]——也就是st1的4个科目,所以st2的tTotal和st1完全一致。

修复后的完整代码

class Subject:
    def __init__(self, name, midTerm, attend, classtest, endterm):
        self.name = name
        self.midTerm = midTerm   
        self.attend = attend    
        self.classtest = classtest   
        self.endterm = endterm 
        self.total = 0
        self.grade = 'F'
        newAttend = attendanceMarks(self.attend)
        if newAttend != -1:
            self.total = newAttend + midTermMarks(midTerm) + classTestMarks(classtest) + endTermMarks(endterm)
            self.grade = gradeCal(self.total)
        else:
            self.grade = 'F'

class Student:
    def __init__(self, name, roll, s1, s2, s3, s4):
        self.name = name
        self.roll = roll
        # 每个学生实例单独维护自己的科目列表
        self.sub = [s1, s2, s3, s4]
        
        # 用sum遍历计算总分,更简洁安全
        self.tTotal = sum(sub.total for sub in self.sub)
        self.tGrade = gradeCal(self.tTotal / 4)

# 测试代码
st1 = Student("Akash", 17, Subject("Compiler Design", 50, 76, 50, 100), Subject("Software Engineering", 50, 76, 50, 100), Subject("Machine Learning", 50, 76, 50, 100), Subject("Natural Language Processing", 50, 76, 50, 100))

st2 = Student("Juan", 23, Subject("Compiler Design", 30, 76, 25, 50), Subject("Software Engineering", 25, 76, 34, 60), Subject("Machine Learning", 39, 76, 45, 66), Subject("Natural Language Processing", 32, 76, 44, 77))

print(st1.tTotal)
print(st2.tTotal)

额外优化点

  • 用sum(sub.total for sub in self.sub)替代手动索引求和,避免后续科目数量变化时出现索引越界问题,代码也更简洁。
  • 确保所有依赖的辅助函数(attendanceMarks、midTermMarks等)正常工作,这是Subject类计算total的前提。

内容的提问来源于stack exchange,提问作者Innocent Dengkhw Mochahari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:46:34