From 50bdd627d8bd469572f255a1128d4304c797be6e Mon Sep 17 00:00:00 2001 From: lkjing2021345 <1908499668@qq.com> Date: Tue, 18 Aug 2026 00:21:53 +0800 Subject: [PATCH] =?UTF-8?q?Add=20Day=5F4:=20=E9=9D=A2=E5=90=91=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1(=E4=B8=80)=20User=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Day_4/README.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++ Day_4/参考解答.py | 46 +++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 Day_4/README.md create mode 100644 Day_4/参考解答.py diff --git a/Day_4/README.md b/Day_4/README.md new file mode 100644 index 0000000..e527a09 --- /dev/null +++ b/Day_4/README.md @@ -0,0 +1,58 @@ +# Day_4 · 面向对象(一):从 class User 开始 + +> Django 最核心的能力是 **ORM**:你定义类,Django 帮你管理数据库表。 +> 打开任何 Django 项目,第一行几乎都是 `class Article(models.Model):`—— +> 这一行的背后,是整片面向对象的大海。 +> 今天我们从最小的一步开始:**类和实例**。 + +## 今日知识点 → 以后在 Django 里对应什么 + +| 今天练的 | 以后在 Django 里会看到 | +| --- | --- | +| 类定义 + 类属性 | `class Article(models.Model)`,字段就是类属性 | +| `__init__` / 实例方法 | Model 实例的构造、`.save()` / `.delete()` | +| `__str__` / `__repr__` 魔法方法 | Admin 后台显示的名称、QuerySet 打印结果 | + +--- + +## 题目(必做):设计一个 User 类 + +**背景**:Django 里定义一个用户模型只需要三行: + +```python +class User(models.Model): + name = models.CharField(max_length=50) + email = models.EmailField() +``` + +看起来像魔法,其实核心就是"类 + 类属性"。今天我们不用 Django,用纯 Python 复刻 User 类。 + +**要求**: + +1. 类属性 `all_users = []`(模拟数据库表,用来存所有创建出来的用户) +2. `__init__(self, name, email, age)`:把三个参数存成实例属性,并把 `self` 追加进 `all_users` +3. 实例方法 `get_full_name()`:返回 `用户:()` +4. 魔法方法 `__str__(self)`:返回 `self.name`(Django admin 后台显示的就是它!) +5. 魔法方法 `__repr__(self)`:返回 `User(name='zhangsan', email='zs@163.com', age=20)` + 这种"能还原出原对象"的格式 + +**验证**: + +- 创建 3 个用户,打印 `User.all_users` +- 分别 `print` 每个用户(会触发 `__str__`) +- 用 `eval(repr(u1))` 还原出 u1 的信息,确认内容一致 + +**思考题(写在注释里)**:`__str__` 和 `__repr__` 到底有什么区别? +(提示:一个是"给人看的",一个是"给开发者调试看的"——具体从使用场景和返回值要求去想。) + +**出题意图**:Django Model 就是"类 + 字段",实例方法和 `__str__` 是每个模型都会写的东西。 +把这一题吃透,`class Article(models.Model)` 对你来说就不再是黑魔法。 + +--- + +## 完成标准 + +- [ ] User 类全流程跑通(创建 / 打印 / 还原) +- [ ] 想通了 `__str__` 和 `__repr__` 的区别 + +完成后打开 `参考解答.py` 对照。建议看完后关掉文件,自己再默写一遍。 diff --git a/Day_4/参考解答.py b/Day_4/参考解答.py new file mode 100644 index 0000000..dfdeec8 --- /dev/null +++ b/Day_4/参考解答.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +""" +Day_4 参考解答 +============= +主题:面向对象(一)—— 类和实例。 +建议:先自己写,写不出来再看;看完后关掉文件自己默写一遍。 +""" + +class User: + all_users = [] # 类属性:模拟数据库表 + + def __init__(self, name, email, age): + self.name = name + self.email = email + self.age = age + User.all_users.append(self) # 把新用户"存表" + + def get_full_name(self): + return f"用户:{self.name}({self.email})" + + def __str__(self): + # 给"人"看的:print(user) 时显示,Django admin 列表里显示的就是它 + return self.name + + def __repr__(self): + # 给"开发者调试"看的:要能还原出原对象,eval(repr(u)) 应得到相同信息 + return f"User(name={self.name!r}, email={self.email!r}, age={self.age!r})" + + +if __name__ == '__main__': + u1 = User("zhangsan", "zs@163.com", 20) + u2 = User("lisi", "ls@163.com", 21) + u3 = User("wangwu", "ww@163.com", 19) + + for u in User.all_users: + print(u, "->", repr(u)) + # zhangsan -> User(name='zhangsan', email='zs@163.com', age=20) + # lisi -> User(name='lisi', email='ls@163.com', age=21) + # wangwu -> User(name='wangwu', email='ww@163.com', age=19) + + restored = eval(repr(u1)) # __repr__ 的用途:可还原 + print(restored.name, restored.email) # zhangsan zs@163.com + + # 思考题答案: + # __str__ 面向普通用户/展示,__repr__ 面向开发者/调试,且要求无歧义可还原; + # 只实现 __repr__ 时,print() 会退而使用 __repr__;反之不会。