如何编写可将Student类对象存入集合的UniClass类?
修正UniClass类的实现问题
需求回顾
- Student类已实现,可创建包含
name、imt_name、semester属性的对象,且__str__方法能返回格式化的学生信息 - 需要实现的UniClass类要求:
- 拥有类名称属性
- 支持将Student对象注册到内部集合中
__str__方法:集合为空时返回"set()",非空时返回包含所有学生信息的集合格式内容
原代码的问题分析
你的UniClass类存在多处逻辑错误:
- 未初始化学生存储集合:
__init__方法里没有创建用于存放Student对象的集合,后续无法维护学生列表 - enroll_student方法逻辑混乱:
- 错误调用
Student.str()(这不是正确的调用方式,完全不符合添加学生的需求) - 使用全局变量
x标记集合状态,既不安全也没必要,直接检查自身的学生集合即可 - 参数命名不合理(如果是添加单个学生,参数名应该是
student而非students),且没有实现添加学生的逻辑
- 错误调用
- __str__方法错误:
- 依赖未初始化的全局变量
x,未调用enroll_student时会触发未定义错误 - 引用未定义的变量
students,应该访问实例的self.students - 没有正确格式化集合输出,需要把每个Student对象转为字符串后再组织成集合格式
- 依赖未初始化的全局变量
修正后的代码
class Student: def __init__(self, name, imt_name, semester): """Constructor""" self.name = name self.imt_name = imt_name self.semester = semester def __str__(self): return "{} [{}] in Semester {}".format(self.name, self.imt_name, self.semester) class UniClass: def __init__(self, name): """Constructor""" self.name = name # 初始化空集合用于存储Student对象 self.students = set() def enroll_student(self, student): # 确保传入的是Student实例,再添加到集合 if isinstance(student, Student): self.students.add(student) # 可选:添加批量注册学生的方法 def enroll_students(self, students_list): for student in students_list: if isinstance(student, Student): self.students.add(student) def __str__(self): if not self.students: return "set()" # 将集合中的每个Student对象转为字符串,再组织成集合格式的字符串 student_strs = [str(s) for s in self.students] return "{" + ", ".join(student_strs) + "}"
代码解释
- UniClass的初始化:
- 在
__init__中新增self.students = set(),创建空集合专门存放Student对象
- 在
- 注册学生方法:
enroll_student方法接收单个Student对象,通过isinstance校验类型后添加到集合- 可选的
enroll_students方法支持批量添加学生列表,更实用
- __str__方法:
- 直接检查
self.students是否为空,无需全局变量 - 非空时,把集合里的每个Student对象通过
str()转为格式化字符串,再用join拼接成类似集合的格式输出
- 直接检查
测试示例
# 创建学生实例 s1 = Student("Alice", "IMT001", 2) s2 = Student("Bob", "IMT002", 3) # 创建班级实例 math_class = UniClass("Advanced Math") # 打印空班级 print(math_class) # 输出: set() # 注册学生 math_class.enroll_student(s1) math_class.enroll_students([s2]) # 打印有学生的班级 print(math_class) # 输出: {Alice [IMT001] in Semester 2, Bob [IMT002] in Semester 3}
内容的提问来源于stack exchange,提问作者user20458448
相关产品推荐
相关产品推荐

