Files
DailyChallenge_ProgrammingD…/Day_5/README.md
T

49 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Day_5 · 面向对象(二):继承 —— 复刻 models.Model
> 上一天你写了 User 类,今天更进一步:**继承**。
> Django 里 Article 没有写 `__init__`,没有写 `save()`,却能 `.save()`——为什么?
> 因为通用能力都在父类 `models.Model` 里,子类只需要写自己的字段。
> 今天我们自己写这个父类。
## 今日知识点 → 以后在 Django 里对应什么
| 今天练的 | 以后在 Django 里会看到 |
| --- | --- |
| 基类 + 子类继承 | 所有 Model 继承 `models.Model` |
| 方法重写 + `super()` | 自定义 Model 的 `save()` / `delete()` |
| `isinstance` / `issubclass` | 判断对象类型、自定义 Manager |
---
## 题目(必做):继承 —— 复刻 models.Model
**要求**:
1. 定义基类 `BaseModel`:
- 类属性 `objects = []`(模拟数据库表)
- `save(self)`:把 `self` 追加进 `objects`,并打印 `[DB] 已保存 <类名>: <str(self)>`
- `delete(self)`:把 `self` 从 `objects` 中移除,打印 `[DB] 已删除 <str(self)>`
- `to_dict(self)`:把实例的所有属性转成字典(提示:`self.__dict__` 是什么?)
- `__str__(self)`:默认返回 `<类名#id>`,比如 `<Article#1405...>`
2. 定义 `Article(BaseModel)`:`__init__` 接收 `title, content, author` 存成实例属性,
再用 `time` 模块记录 `created_at`(形如 `2026-08-18 10:30:00`)
3. 定义 `Comment(BaseModel)`:`__init__` 接收 `content, author`
4. 全流程走一遍:创建文章和评论 → save → 遍历 `BaseModel.objects` 打印 → `to_dict()` → delete
5. 验证继承关系:`print(issubclass(Article, BaseModel))` 应为 `True`,
`print(isinstance(a, BaseModel))` 应为 `True`
**进阶(思考 + 动手)**:如果要求"Article 保存前先打印一行日志",而 `save()` 写在父类里,
怎么办?(提示:在子类里**重写** `save()`,先打印,再 `super().save()`。试试看输出顺序。)
**出题意图**:Django 的 Model 就是"通用逻辑放父类,子类只写自己的字段"。
理解了继承 + `super()`,你就理解了为什么 Django 模型"不写 save 却能保存"。
---
## 完成标准
- [ ] BaseModel + Article + Comment 全流程跑通(save / 遍历 / to_dict / delete)
- [ ] 继承验证两行输出均为 `True`(进阶则 +1:重写 save + super)
完成后打开 `参考解答.py` 对照。建议看完后关掉文件,自己再默写一遍。