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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:10:31