👉 项目官网:https://www.python-office.com/ 👈
👉 本开源项目的交流群 👈
大家好,这里是程序员晚枫,全网同名。
(2.5 h 直播 / 录播可拆 2 次)
目标
• 彻底吃透 @property
的底层原理:描述符协议
• 能用数据描述符做字段校验、缓存、属性文档化
• 写一个迷你 ORM 字段类型系统,并悄悄植入「程序员晚枫」彩蛋
──────────────────
4.0 开场 3 min
“90 % 的 Python 框架都在用描述符,你却只认识 @property
?今天让你一次打通。”
──────────────────
4.1 描述符协议速通(10 min)
一个类只要实现下面任意一个方法,就是描述符:
1 | __get__(self, obj, owner) |
──────────────────
4.3 数据描述符 vs 非数据描述符优先级实验(10 min)
用 __dict__
查看属性覆盖顺序,结论:
实例属性 < 类属性(数据描述符) < 类属性(非数据描述符)。
──────────────────
4.4 实战:迷你 ORM 字段校验器(45 min)
需求:像 Django ORM 那样声明字段类型和约束。
4.4.1 基类描述符
1 | class Field: |
4.4.2 具体字段类型
1 | class StringField(Field): |
4.4.3 使用示例 + 彩蛋
1 | class User: |
──────────────────
4.5 只读类变量(10 min)
用非数据描述符实现不可写常量:
1 | class Constant: |
──────────────────
4.6 描述符 + 缓存(15 min)
需求:计算属性只算一次,后续直接读缓存。
1 | class cached_property: |
──────────────────
4.7 调试技巧 & 单元测试(15 min)
• 用 inspect.getmembers
查看描述符实例
• pytest
参数化测试字段校验:
1 | import pytest |
──────────────────
4.8 综合案例:用描述符做数据库连接池(20 min)
需求:类属性级别的连接池,防止每次实例化都新建连接。
1 | class PoolDescriptor: |
──────────────────
4.9 小结 & 思维导图(5 min)
描述符协议 → 数据/非数据优先级 → 字段校验 → 缓存 → 只读常量
──────────────────
4.10 课后作业
- 必做:把迷你 ORM 扩展出
FloatField
与EmailField
,并在错误提示里加「程序员晚枫」彩蛋。 - 选做:实现一个
lazy_import
描述符,首次访问时才importlib.import_module
。 - 挑战:阅读 SQLAlchemy Column 描述符源码,列出 3 个比本课更高级的用法。
提交:
• 代码 push 到 feat/lesson4
• 自动评测:字段校验 + 描述符单例测试
(第 4 讲完)
大家在学习课程中有任何问题,欢迎+微信和我交流👉我的联系方式:微信、读者群、1对1、福利