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
相关产品推荐
相关产品推荐

