Python:为对象连续添加三次分数时遇TypeError问题求助
问题修复方案
一、解决报错问题
你遇到的TypeError是因为错误地用类名调用实例方法,错误栈显示你写了s = student.setTestScore(test,score),正确写法是直接调用实例的方法,无需赋值:
s.setTestScore(test, score)
类名直接调用实例方法时必须手动传入实例对象(self),而用实例s调用时会自动传入,修改后即可解决该报错。
二、功能逻辑修正
除了报错,代码还有几处逻辑问题,导致无法实现“输入3次测试编号和分数,输出编号、分数及平均分”的需求,以下是修正点:
1. 内层循环次数错误
当前内层循环for i in range(len(classList))会让每个学生输入班级人数次分数,而非3次。改成固定循环3次:
for i in range(3): # 对应3次测试 test = int(input("enter test number: ")) score = int(input("enter test score: ")) s.setTestScore(test, score)
2. 存储测试编号和分数
原代码只存分数,未存测试编号,输出时无法显示编号。修改student类的setTestScore方法,将测试编号和分数以元组形式存入:
def setTestScore(self, test, result): # 修正条件判断:测试编号1-3,分数0-100,用逻辑或or替代按位或| if test < 1 or test > 3 or result < 0 or result > 100: print("Error: Wrong test results.") else: self.testResults.append( (test, result) ) # 存元组(测试编号, 分数)
3. 平均分计算优化
原代码固定除以3.0,若测试次数不是3次会出错,改成根据实际存储的测试次数计算:
def average(self): total = 0 for _, result in self.testResults: # 只取分数求和 total += result # 避免除以0的情况 return total / len(self.testResults) if self.testResults else 0
4. 输出格式修正
原__str__方法存在字符串拼接错误,且无法显示测试编号,修改后:
def __str__(self): testAString = "" for test_num, score in self.testResults: testAString += f"测试{test_num}: {score}分\n" # 显示测试编号和分数 result = f"学生姓名:\n{self.firstName} {self.lastName}\n" result += f"课程名称:\n{self.courseName}\n" result += f"课程代码: {self.courseCode}\n" result += "测试成绩:\n" + testAString result += f"平均分:\n{self.average():.2f}\n" # 保留两位小数更直观 result += f"家庭地址:\n{self.homeAddress}\n" result += f"学校地址:\n{self.schoolAddress}" return result
5. Course类方法修复
原Course类的setCourseCode方法错误赋值给self.course,修正为:
def setCourseCode(self, code): self.code = code
6. 保存Course实例
原student类的__init__方法创建了Course对象但未保存,改为:
self.course = Course(courseName, courseCode)
三、修改后的完整代码
Main.py
from student import student def studentArray(): classSize = int(input("班级人数是多少?")) classList = [] num = 0 while num < classSize: firstName = input("\n学生的名字是?") lastName = input("\n学生的姓氏是?") homeAddress = input("\n学生的家庭地址是?") schoolAddress = input("\n学生的学校地址是?") courseName = input("\n学生修的课程名称是?") courseCode = input("\n课程代码是?") classList.append(student(firstName, lastName, homeAddress, schoolAddress, courseName, courseCode)) num += 1 for s in classList: print(f"\n开始输入{s.firstName} {s.lastName}的3次测试成绩:") for i in range(3): test = int(input("输入测试编号(1/2/3):")) score = int(input("输入对应分数:")) s.setTestScore(test, score) print("\n学生信息:") print(s) studentArray()
studentclass.py
from Course import Course class student: def __init__(self, first, last, home, school, courseName, courseCode): self.firstName = first self.lastName = last self.homeAddress = home self.schoolAddress = school self.courseName = courseName self.courseCode = courseCode self.course = Course(courseName, courseCode) # 保存Course实例 self.testResults = [] # 存储(测试编号, 分数)元组 def setTestScore(self, test, result): if test < 1 or test > 3 or result < 0 or result > 100: print("错误:测试编号必须是1-3,分数必须是0-100。") else: self.testResults.append( (test, result) ) def average(self): total = 0 for _, score in self.testResults: total += score return total / len(self.testResults) if self.testResults else 0 def __str__(self): testAString = "" for test_num, score in self.testResults: testAString += f"测试{test_num}: {score}分\n" result = f"学生姓名:\n{self.firstName} {self.lastName}\n" result += f"课程名称:\n{self.courseName}\n" result += f"课程代码: {self.courseCode}\n" result += "测试成绩:\n" + testAString result += f"平均分:\n{self.average():.2f}\n" result += f"家庭地址:\n{self.homeAddress}\n" result += f"学校地址:\n{self.schoolAddress}" return result
Courseclass.py
class Course: def __init__(self, course, code): self.course = course self.code = code def setCourseName(self, name): self.course = name def setCourseCode(self, code): self.code = code
内容的提问来源于stack exchange,提问作者Snickers
相关产品推荐
相关产品推荐

