订单模型与JSON|课后复习
今天把规则放到明确的对象边界:单条明细有自己的属性与方法,购物车组合多条明细,保存和恢复时重新核对价格、数量与字段。
沿图比较商品调整前后的两种价格:新交易使用现价,已保存的订单明细使用当时快照。图片说明业务关系,实际是否保存成功还需本人新进程读取。
| 机制 | 商城哪里用 | 必须能解释 |
|---|---|---|
| class、实例、self、属性方法 | OrderLine | 两次构造是两个对象,方法读取当前对象 |
| init/str/repr/eq/len | 初始化、展示、排错、往返核对、购物车行数 | 值相等不代表同一对象;行数不等于件数 |
| dataclass和__post_init__ | 少写重复方法与构造校验 | 注解不校验;frozen不是深度不可变 |
| StrEnum | 订单状态名称 | 合法名称仍可能是非法迁移 |
| 组合/继承/拷贝 | 购物车、规则类型、价格快照 | 有一组明细用组合;浅复制仍共享嵌套对象 |
| Path/编码/模式/with | 快照文件 | 路径以cwd解释,文本与字节不同,with负责关闭 |
| JSON与显式恢复 | 把明细存为文本后恢复 | Decimal转字符串;先字段检查再构造校验 |
| 风险 | 提前预防 | 怎样发现 | 怎样处理 | 怎样复验 |
|---|---|---|---|---|
| 类属性列表串车 | 列表在__init__创建 | 给A加商品后看B | 每实例独立列表 | 两车连续加商品仍独立 |
| 浅复制污染历史 | 明确复制层级与快照字段 | 修改嵌套quantity | 对需要隔离的层复制或构造只读快照 | 商品改价、历史金额不变 |
| 类型注解冒充校验 | 构造入口显式检查 | True、0、NaN、1.001 | 复用规则并拒绝非法值 | 原失败拒绝、合法1通过 |
| 金额经过float | 全程Decimal,JSON字符串 | 检查类型和文件原文 | 修转换边界 | 往返相等且类型仍Decimal |
| 坏文件被当空数据 | 读取失败不写文件 | 比较错误前后字节 | 保留文件与异常再定位 | 原坏文件仍相同,合法新文件能读 |
| 直接覆盖旧快照 | 本日save用x新建 | 已存在目标再次保存 | 换新文件名,说明已存在 | FileExistsError且旧内容不变 |
自测:为什么__str__不能支付?两个同值对象为何is为假?len(cart)如何约定?StrEnum能否允许已支付取消?with关闭文件是否回滚写入?逐项用今天的实际运行回答。
保留本人src/models.py、价格快照往返结果与累计订单字段恢复记录。最小明细完成不等于整笔订单已保存。D05从这些代码继续增加CLI、装饰器、异常分类与pytest;课后只整理课堂结果,不新增必做开发。