👉 项目官网:https://www.python-office.com/ 👈
👉 本开源项目的交流群 👈
大家好,这里是程序员晚枫,全网同名。
(3 h 直播 / 录播可拆 2 次)
目标
• 把“类也是对象”这句话从口号变成代码
• 会用元类做「自动注册、字段校验、API 自动生成」三件实事
• 写一个可插拔的插件框架,并悄悄植入「程序员晚枫」彩蛋
──────────────────
5.0 开场 3 min
“写元类不是为了炫技,而是为了少写 300 行样板代码。”
──────────────────
5.1 温故:type
的三参数形式(10 min)
现场演示“一句话造车”:
1 | Dog = type('Dog', (object,), {'bark': lambda self: 'woof!'}) |
结论:类 = type(name, bases, dict)
的返回值。
──────────────────
5.2 元类 vs 类装饰器:何时选谁?(10 min)
| 需求 | 元类 | 类装饰器 |
|————————–|——|———-|
| 控制类创建过程 | ✅ | ❌ |
| 修改类属性/方法名 | ✅ | ✅ |
| 兼容多重继承 | ✅ | ⚠️ |
| 代码直观易读 | ❌ | ✅ |
──────────────────
5.3 实战 1:自动注册插件系统(45 min)
需求:所有继承 Plugin
的子类自动加入全局注册表,并打印「程序员晚枫」提示。
5.3.1 元类骨架
1 | class PluginMeta(type): |
5.3.2 使用示例
1 | class EmailNotifier(Plugin): |
──────────────────
5.4 实战 2:字段校验 2.0(30 min)
把第 4 讲的描述符 ORM 升级为「元类自动注入字段名」。
1 | class ModelMeta(type): |
──────────────────
5.5 实战 3:自动生成 REST 路由(25 min)
需求:在类里写方法,元类自动把 /类名/方法名
注册到 Flask。
1 | from flask import Flask |
浏览器访问 http://localhost:5000/user/list
即可看到响应。
──────────────────
5.6 调试技巧:查看类创建过程(10 min)
• 在 __new__
/ __init__
打断点
• inspect.getmro()
观察 MRO 变化
• type.__subclasses__(Plugin)
查看已注册插件
──────────────────
5.7 常见误区与最佳实践(10 min)
- 避免多重元类冲突 → 使用
class MyMeta(type(Plugin))
- 元类过于隐晦 → 提供
__repr__
方便调试 - 优先类装饰器 → 除非必须干预类创建
──────────────────
5.8 综合案例:配置中心自动填充(20 min)
需求:根据 YAML 文件自动生成 dataclass,并校验类型。
1 | import yaml, typing |
──────────────────
5.9 小结 & 思维导图(5 min)
元类三要素:__new__
→ 类对象 → 动态注册/校验/路由
──────────────────
5.10 课后作业
- 必做:在插件注册系统里加「程序员晚枫」专属 ASCII Logo 打印。
- 选做:写一个元类,让类属性支持中文方法名自动转拼音路由。
- 挑战:阅读 Django ModelBase 源码,列出 2 个元类黑科技。
提交:
• 代码 push 到 feat/lesson5
• GitHub Action 自动运行 pytest && python -m flask routes
(第 5 讲完)
大家在学习课程中有任何问题,欢迎+微信和我交流👉我的联系方式:微信、读者群、1对1、福利