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

如何从Student类中返回所有学生对象及其ID?

解决方案

1. 改造Student类以追踪所有实例

原代码的核心问题是没有保存已创建的Student实例,导致无法直接获取所有学生信息。我们可以给Student类添加一个类属性students(字典类型),用来存储所有学生实例(键为学生ID,值为学生对象),同时调整初始化逻辑:

import itertools

class Student(object):
    id_iter = itertools.count()
    students = {}  # 类级字典,存储所有学生实例

    def __init__(self, studentName):
        self.id = next(self.id_iter)
        self.studentName = studentName
        # 将新实例存入类字典
        Student.students[self.id] = self

    def __str__(self):
        return f"[{self.studentName}, {self.id}]"

这里把原代码中合并在列表里的姓名和ID拆成了单独的属性,结构更清晰,方便后续操作。

2. 实现获取所有学生信息的函数

直接读取类属性students,遍历后整理成姓名与ID的列表即可:

def get_all_students():
    return [[stu.studentName, stu_id] for stu_id, stu in Student.students.items()]

测试示例:

stud1 = Student("Justa Student")
stud2 = Student("Another One")
stud3 = Student("One Morestudent")

print(get_all_students())
# 输出: [['Justa Student', 0], ['Another One', 1], ['One Morestudent', 2]]

3. 实现删除学生的功能

通过ID直接操作students字典完成删除,无需依赖最高ID遍历:

def delete_student(student_id):
    if student_id in Student.students:
        del Student.students[student_id]
        return True  # 删除成功返回True
    return False  # ID不存在返回False

测试删除逻辑:

delete_student(1)
print(get_all_students())
# 输出: [['Justa Student', 0], ['One Morestudent', 2]]

关于“遍历最高ID”思路的问题

你之前考虑的遍历最高ID方案存在两个明显缺陷:

  • 一旦有学生被删除,最高ID对应的实例可能已经不存在,遍历会出现无效项;
  • itertools.count()生成的ID是持续递增的,即使删除中间ID,新学生的ID仍会继续累加,最高ID会越来越大,遍历效率极低且容易出错。

用类字典存储实例的方式,既能快速获取所有有效学生信息,也能通过ID直接定位删除,效率和准确性都更优。

内容的提问来源于stack exchange,提问作者ecomo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:01:44