Python类开发学生成绩程序遇AttributeError错误求助
问题分析与修正
错误原因
你遇到的AttributeError: 'str' object has no attribute 'name'是因为直接用类student调用了实例方法calc,并且传入了空字符串''。实例方法的第一个参数self本来应该指向类的实例对象,但你这么调用时,self被赋值成了传入的空字符串,字符串对象当然没有name属性。
此外你的代码还有其他逻辑问题:
input()获取的N是字符串类型,直接用在range(0, N)会报错calc方法里的循环刚执行一次就return,导致只能录入一个科目和成绩__init__方法要求初始化时传入所有参数,但你的需求是动态录入信息,参数设计不合理- 缺少计算平均分的核心逻辑
修正后的代码
class Student: # 简化初始化,只保留可选的基础信息,科目和成绩后续动态录入 def __init__(self, standard=None, age=None, address=None): self.standard = standard self.name = None self.subjects = [] self.scores = [] self.age = age self.address = address def input_info(self): # 录入基础信息 self.name = input('Enter Your full name: ').upper() self.standard = input('Enter your class/standard: ') self.age = input('Enter your age: ') self.address = input('Enter your address: ') # 录入科目数量并做有效性验证 while True: try: n = int(input('Please Enter number of Subjects: ')) if n <= 0: print("Number of subjects must be positive!") continue break except ValueError: print("Please enter a valid integer!") # 循环录入科目和对应成绩 for _ in range(n): subject = input('Enter Subject name: ').upper() self.subjects.append(subject) # 成绩输入验证,确保是有效数字且在合理范围 while True: try: score = float(input(f'Please Enter the score for {subject}: ')) if score < 0 or score > 100: print("Score must be between 0 and 100!") continue self.scores.append(score) break except ValueError: print("Please enter a valid number for score!") def calc_average(self): if not self.scores: return 0.0 total = sum(self.scores) return round(total / len(self.scores), 2) # 正确使用方式:先创建类实例,再调用实例方法 student1 = Student() student1.input_info() average_score = student1.calc_average() # 输出整理后的学生信息 print(f"\nStudent Information:") print(f"Name: {student1.name}") print(f"Class: {student1.standard}") print(f"Age: {student1.age}") print(f"Address: {student1.address}") print(f"Subjects & Scores: {dict(zip(student1.subjects, student1.scores))}") print(f"Average Score: {average_score}")
关键修改点
- 类名改为
Student(符合Python大驼峰命名规范) - 重构
__init__方法,改为可选参数,适配动态录入的场景 - 将原
calc拆分为input_info(负责信息录入)和calc_average(负责计算平均分),职责更清晰 - 增加输入验证:确保科目数量、成绩是有效数字,且成绩在0-100的合理范围
- 遵循类的使用规范:先创建实例,再调用实例方法,避免把字符串传给实例方法的
self参数 - 增加结果输出逻辑,直观展示学生信息和计算出的平均分
内容的提问来源于stack exchange,提问作者ezekiel mhando
相关产品推荐
相关产品推荐

