关于 python-design-patterns
帮助在 Python 组件和系统中运用基础设计原则的技能,面向希望让代码更简单、模块化、易测试且便于修改的开发者。
主要功能
- 01应用单一职责原则
- 02优先组合而非继承
- 03依据三次原则决定抽象
- 04通过依赖注入提升可测试性
适用场景
- 01设计新的 Python 组件
- 02重构复杂代码
- 03评估复杂度与耦合
- 04规划模块化架构
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ wshobson/ agents --skill python-design-patterns安装后在 Claude Code 中输入/python-design-patterns确认已加载。
附带文件references/details.md
详细介绍
Python 设计模式
使用基本设计原则编写可维护的 Python 代码。这些模式可帮助你构建易于理解、测试和修改的系统。
何时使用此技能
- 设计新组件或服务
- 重构复杂或混乱的代码
- 决定是否创建抽象
- 在继承与组合之间做出选择
- 评估代码复杂度和耦合度
- 规划模块化架构
核心概念
1. KISS(保持简单)
选择能起作用的最简单解决方案。复杂度必须由具体需求来证明其合理性。
2. 单一职责(SRP)
每个单元应只有一个变更原因。将关注点分离为职责聚焦的组件。
3. 组合优于继承
通过组合对象来构建行为,而不是扩展类。
4. 三次法则
在有三个实例之前不要抽象。重复往往比过早抽象更好。
快速开始
# Simple beats clever
# Instead of a factory/registry pattern:
FORMATTERS = {"json": JsonFormatter, "csv": CsvFormatter}
def get_formatter(name: str) -> Formatter:
return FORMATTERS[name]()
详细模式与完整示例
详细的模式文档位于 references/details.md。当上述导航层级不够用时,请阅读该文件。
最佳实践总结
- 保持简单 - 选择能起作用的最简单解决方案
- 单一职责 - 每个单元只有一个变更原因
- 分离关注点 - 具有明确用途的不同层次
- 组合,而非继承 - 组合对象以获得灵活性
- 三次法则 - 抽象之前先等待
- 保持函数小巧 - 20-50 行(因复杂度而异),单一用途
- 注入依赖 - 使用构造函数注入以提高可测试性
- 先删除再抽象 - 移除死代码,然后再考虑模式
- 测试每一层 - 为每个关注点编写隔离测试
- 显式优于聪明 - 可读的代码胜过优雅的代码
故障排除
一个类不断膨胀,似乎承担了多项职责,但拆分它又感觉不对。 应用“变更原因”测试:列出所有可能需要修改此类的变更。如果列表中的条目来自不同领域(例如,HTTP 解析、业务规则和格式化),则拆分它。如果所有变更都源于同一领域关注点,则该类的规模可能是合适的。
通过构造函数注入所有依赖导致构造函数有 7 个以上参数。 这是一个类中职责过多的迹象,而不是依赖注入的问题。首先将该类拆分为更小的单元,然后每个构造函数自然会变小。
组合产生了难以追踪的深层嵌套包装对象。 保持组合浅层(2-3 层)。如果包装是唯一机制,考虑基于 Protocol 的方法或简单的函数组合是否比一连串装饰器对象更清晰。
三次法则说还不要抽象,但当更新一个副本而没有更新另一个时,重复导致了 bug。 以危险方式分叉的重复应尽早抽象。三次法则是一种启发式方法,而不是定律。如果副本已经出现错误的分叉,立即提取并添加一个测试来验证共享行为。
服务层正在从 API 层导入,破坏了依赖方向。 这是分层违规。服务层不得从处理器导入。引入一个共享的类型/模型层,让两者都可以从中导入,保持依赖箭头向下(API → 服务 → 仓库)。
相关技能
- python-testing-patterns — 使用此处建立的依赖注入结构,对每一层进行隔离测试
- python-project-structure — 组织模块和目录布局,使层次边界从一开始就明确