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

Python字典实现报名列表类与JSON序列化代码优化咨询

现有代码的核心问题
  • 方法命名完全不符合规范:Python中前后带双下划线的是解释器预留的魔法方法,自定义业务方法不需要加这种前后双下划线,现有__addEnrollment__这类写法是错误的,且方法内部没有任何实际存储逻辑,直接返回Enrollment类本身没有任何作用。
  • 存储逻辑混乱:你让ListOfEnrollments继承了dict类,却去操作self.__dict__——这个属性是用来存储实例自身属性的,和继承来的dict存储结构完全独立,数据根本不会存到你预期的字典结构里。
  • 方法参数和语法错误:需求里get方法只需要接收报名编码一个查询参数,你写的方法传了所有报名字段;drop方法你错写成了__delitem__,且方法定义行末尾缺少冒号,运行直接报语法错误。
  • 序列化逻辑完全不成立:最后一行直接调用json.loads但从未定义enrollment_string变量,且自定义类的实例无法直接被json模块序列化,直接dump会报类型错误。

可直接运行的正确实现
import json

class Enrollment:
    def __init__(self, code, enroll_date, course_name, student_id, exam_date):
        # 重命名参数避免两个date字段语义混淆
        self.code = code
        self.enroll_date = enroll_date
        self.course_name = course_name
        self.student_id = student_id
        self.exam_date = exam_date

    def to_dict(self):
        # 把实例属性转为普通字典,解决自定义类无法JSON序列化的问题
        return {
            "code": self.code,
            "enroll_date": self.enroll_date,
            "course_name": self.course_name,
            "student_id": self.student_id,
            "exam_date": self.exam_date
        }

class ListOfEnrollments:
    def __init__(self):
        # 内部单独维护字典存储结构,key为唯一的报名编码,value为Enrollment实例
        self._enrollment_map = {}

    def addEnrollment(self, code, enroll_date, course_name, student_id, exam_date):
        # 新增前做重复校验,避免编码冲突覆盖数据
        if code in self._enrollment_map:
            raise ValueError(f"报名编码 {code} 已存在,不可重复添加")
        self._enrollment_map[code] = Enrollment(code, enroll_date, course_name, student_id, exam_date)

    def get(self, code):
        # 按编码查询,匹配不到直接返回None
        record = self._enrollment_map.get(code)
        return record.to_dict() if record else None

    def drop(self, code):
        # 按编码删除,匹配不到直接抛键错误
        if code not in self._enrollment_map:
            raise KeyError(f"报名编码 {code} 不存在,删除失败")
        del self._enrollment_map[code]

    def toJSON(self):
        # 先把所有实例转成字典列表,再序列化为JSON字符串
        all_records = [item.to_dict() for item in self._enrollment_map.values()]
        return json.dumps(all_records, ensure_ascii=False)

关键逻辑说明
  • 内部字典存储:不要混用self.__dict__和业务存储结构,单独定义带下划线前缀的内部属性_enrollment_map存数据,用唯一报名编码当key,查询、删除的时间复杂度为O(1),比列表遍历效率高很多。
  • JSON序列化:json模块默认只支持字典、列表、字符串、数字等基础内置类型,自定义类实例不能直接序列化,给Enrollment加to_dict()方法做一层转换即可,加ensure_ascii=False参数是为了中文不会被转成Unicode编码,输出可读性更好。
  • 鲁棒性优化:新增、删除、查询操作加简单的存在性判断,出错时直接抛出明确的异常信息,比静默失败更方便排查问题。

简单使用示例
# 初始化报名列表
enroll_system = ListOfEnrollments()
# 新增一条报名记录
enroll_system.addEnrollment(
    code="CS1001-20240601",
    enroll_date="2024-05-20",
    course_name="Python程序设计基础",
    student_id="202400123",
    exam_date="2024-06-15"
)
# 查询记录
print(enroll_system.get("CS1001-20240601"))
# 导出JSON字符串
json_str = enroll_system.toJSON()
print(json_str)
# 删除记录
enroll_system.drop("CS1001-20240601")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:48:40