《Python高级编程》2.2 类装饰器、__set_name__ 与属性工厂
本节讲透类装饰器与 __set_name__ 的执行时机:类装饰器在元类 __init__ 之后运行,看到的是已经完成 __set_name__ 的类对象;__set_name__ 按定义顺序为每个描述符调用一次,且 3.12 起异常不再被包装成 RuntimeError。再用属性工厂与 __init_subclass__ 组合实测一个字段收集框架,并对照标准库 cached_property。
category
本节讲透类装饰器与 __set_name__ 的执行时机:类装饰器在元类 __init__ 之后运行,看到的是已经完成 __set_name__ 的类对象;__set_name__ 按定义顺序为每个描述符调用一次,且 3.12 起异常不再被包装成 RuntimeError。再用属性工厂与 __init_subclass__ 组合实测一个字段收集框架,并对照标准库 cached_property。
本节从 CPython 实现角度拆解 class 语句:它如何脱糖成 __build_class__ 与 type() 三参数调用,元类的 __prepare__、__new__、__init__ 与 __set_name__、__init_subclass__ 的精确执行顺序,元类冲突背后的 MRO 规则,以及何时该用 __init_subclass__ 替代元类。附实测时序与性能数据。
长连接上线后真正难的三件事:用 ping/pong 心跳及时剔除假死连接、用指数退避加抖动做健壮重连、用并发安全的 ConnectionManager 广播并给慢消费者做有界队列背压,每一步都附真实运行输出与取舍分析,并给出可对照的上线检查清单。
用一条只读 HTTP 流做服务端推送:真跑 text/event-stream 的 data/event/id 字段、StreamingResponse 流式输出与 Last-Event-ID 断线续传,并给出 SSE 与 WebSocket 的选型对照。
从轮询到双向长连接:用标准库真跑一遍 WebSocket 握手与帧格式,掌握 FastAPI 的 @app.websocket 与 WebSocketDisconnect,并设计带类型字段与版本协商的 JSON 消息信封,最后讲清文本 JSON 与二进制的取舍。
Python 微服务架构完整指南:单体 vs 微服务决策、服务拆分原则、FastAPI 服务模板、gRPC/HTTP 服务间通信、RabbitMQ/Kafka 消息驱动、服务发现与网关、可观测性、部署与演进式拆分路径。
Python 网络爬虫与自动化完整指南:requests/httpx 请求、BeautifulSoup/lxml 解析、Scrapy 框架、Playwright 浏览器自动化、反爬应对(限速/代理/指纹)、robots 合规与数据清洗工程。
Python 库与 API 设计完整指南:包结构与模块划分、公开 API 面设计、类型标注与 Protocol、语义化版本与向后兼容策略、文档工程(docstring/类型/示例)、发布与社区治理,附高质量库案例拆解。
Python 调用 C/C++ 的四种方案全对比:ctypes 动态库调用、cffi 安全绑定、Cython 编译加速、PyO3/Rust 扩展,含性能基准、GIL 释放、构建配置与实战案例。
Python 调试与日志工程完整指南:print 调试进阶、pdb/ipdb/breakpoint 交互调试、logging 架构(Logger/Handler/Formatter/Filter)、结构化日志(structlog/JSON)、异常追踪与 traceback、性能剖析、生产可观测性集成。
Python 设计模式完整指南:SOLID 五原则、创建型/结构型/行为型经典模式、用 Python 语言特性(装饰器/描述符/生成器/鸭子类型)简化经典模式、函数式模式、模式选型与过度设计、实战架构示例。
本节从协议角度讲清 dunder:用实测证明隐式调用只在类型上查找、绕过实例字典,拆开迭代协议的 __iter__ 与 __getitem__ 回退、比较协议的 __eq__/__hash__ 联动、NotImplemented 触发的反射运算与子类优先规则,并用 dis 的 BINARY_OP/COMPARE_OP 把运算符还原成方法调用。
本节用实测把 obj.attr 的查找顺序拆开:沿 type.__mro__ 找数据描述符、实例 __dict__、非数据描述符的优先级,逐一验证 property/staticmethod/cached_property 各自是哪一类描述符,并用 dis 的 LOAD_ATTR 与 member_descriptor 说明 __slots__ 的底层实现。
本节从 CPython 实现层拆开「一切皆对象」:用 id/type/sys.getsizeof 实测 PyObject 的引用计数与类型指针,用 sys.getrefcount 观察 3.12+ 的不朽对象(PEP 683),用 dis 反汇编说清名字绑定只是字典指向对象,并给出小整数缓存与字符串驻留的真实边界。
回到最前线的防御:用 Pydantic 与 pathlib 把不可信输入挡在门外并真跑路径遍历拦截,讲透密码哈希、危险函数禁用、依赖供应链的威胁模型、锁文件加 hash 校验、pip-audit 扫描与 SBOM 思路,最后落到最小权限加固清单。
认证之后是授权:本节对比 ACL/RBAC/ABAC 三种模型,用角色到权限集合实现 RBAC 并接进 FastAPI 依赖,再讲透多租户的独立库、独立 schema 与行级 tenant_id 三种隔离方案,并写出能真跑的越权测试用例验证边界。
认证回答「你是谁」:本节用标准库 hmac/hashlib 手写 HS256 的 JWT 签发与校验并真跑,讲透算法混淆、过期与时钟偏移三类坑,再把 Bearer 依赖接进 FastAPI,最后梳理 OAuth2 授权码流程与 PKCE 的工程要点。
本节讲定时任务的三种形态与延时队列的 ZSET 调度,重点落在幂等键的设计:用 SET NX 抢占、状态机去重与结果缓存保证重复投递只执行一次,并区分「至少一次」投递语义下如何做到业务幂等;最后给出死信队列的人工重放流程与告警口径,全部用 fakeredis 2.39.0 实测。
本节先对比 Celery 与 arq 的模型差异,讲清 broker、worker、结果后端与可见性超时的机制;再用 tenacity 9.2.1 实测指数退避重试,并用纯 asyncio 加 fakeredis 2.39.0 手写一个最小可靠队列,演示 RPOPLPUSH 取任务、失败重试与死信投递的完整链路。
本节把缓存拆成三个可决策的问题:本地缓存与分布式缓存怎么分工,Cache-Aside 与 Write-Through 各自适合什么写场景,以及键命名、TTL 与淘汰策略如何一起设计。再用 fakeredis 2.39.0 实测穿透、击穿、雪崩三类故障的工程对策,并给出基于 SET NX EX 与 WATCH 的分布式锁实现。