本书介绍Python软件工程的主要实践和原则,旨在帮助读者编写更易于维护和更整洁的代码。全书共10章:第1章介绍Python语言的基础知识和搭建Python开发环境所需的主要工具;第2章描述Python风格代码,介绍Python中的第一个习惯用法;第3章总结好代码的一般特征,回顾软件工程中的一般原则;第4章介绍一套面向对象软件设计的原则,即SOLID原则;第5章介绍装饰器,它是Python的**特性之一;第6章探讨描述符,介绍如何通过描述符从对象中获取更多的信息;第7章和第8章介绍生成器以及单元测试和重构的相关内容;第9章回顾Python中最常见的设计模式;第10章再次强调代码整洁是实现良好架构的基础。
本书适合所有Python编程爱好者、对程序设计感兴趣的人,以及其他想学习更多Python知识的软件工程的从业人员。
1.介绍实现Python代码整洁应遵循的基本原则;
2.涵盖避免由不良代码导致的效率低下以及存在诸多隐患的代码的方法;
3.作者专业背景深厚,项目经验丰富;
4.本书的代码示例基于Python3.7版本;
5.提供源代码。
马里亚诺.阿那亚(Mariano Anaya)是西班牙籍软件工程师,有丰富的用Python语言开发软件,并在软件体系结构、函数式编程、分布式系统等领域颇有建,曾在2016年和2017年“欧洲Python大会”上发表演讲。
第 1章 简介、代码格式和工具 1
1.1 代码整洁的意义 2
1.2 代码整洁的重要性 2
1.2.1 代码格式化在代码整洁中的作用 3
1.2.2 在项目中遵循编码风格准则 4
1.3 文档字符串和注解 6
1.3.1 文档字符串 6
1.3.2 注解 9
1.3.3 注解是否会替代文档字符串 11
1.3.4 配置用于实施基本质量控制的工具 12
1.4 小结 16
第 2章 Python风格代码 17
2.1 索引和切片 18
2.2 上下文管理器 21
2.3 对象的属性、特性和不同类型的方法 26
2.3.1 Python中的下划线 27
2.3.2 属性 29
2.4 可迭代对象 31
2.4.1 创建可迭代对象 32
2.4.2 创建序列 34
2.5 容器对象 36
2.6 对象的动态属性 37
2.7 可调用对象 39
2.8 魔法方法概述 40
2.9 Python中的警告 41
2.9.1 可变的默认参数 41
2.9.2 扩展内置类型 42
2.10 小结 44
第3章 好代码的一般特征 45
3.1 契约式设计 46
3.1.1 前置条件 47
3.1.2 后置条件 48
3.1.3 Python的契约 48
3.1.4 设计契约:结论 49
3.2 防错性程序设计 50
3.2.1 错误处理 50
3.2.2 在Python中使用断言 57
3.3 关注点分离 58
3.4 常用缩略词 60
3.4.1 DRY和OAOO 60
3.4.2 YAGNI 62
3.4.3 KIS 63
3.4.4 EAFP和LBYL 64
3.5 组合和继承 65
3.5.1 什么时候继承是一个好的决定 66
3.5.2 反模式的继承 67
3.5.3 Python中的多重继承 69
3.6 函数和方法中的参数 72
3.6.1 Python函数的参数是如何工作的 73
3.6.2 函数中参数的数量 77
3.7 关于软件设计良好实践的结束语 80
3.7.1 软件的正交性 80
3.7.2 构建代码 82
3.8 小结 83
第4章 SOLID原则 84
4.1 单一职责原则 84
4.1.1 一个有太多职责的类 85
4.1.2 分配责任 86
4.2 打开/关闭原则 87
4.2.1 不遵循打开/关闭原则的可维护性风险的示例 88
4.2.2 重构事件系统以获得可扩展性 90
4.2.3 扩展事件系统 92
4.2.4 关于OCP的结束语 94
4.3 里氏替换原则 94
4.3.1 使用工具检测LSP问题 95
4.3.2 更微妙的LSP违规案例 97
4.3.3 关于LSP需要注意的一些点 100
4.4 接口隔离原则 100
4.4.1 提供太多信息的接口 102
4.4.2 接口越小越好 102
4.4.3 接口应该多小 103
4.5 依赖倒置原则 103
4.5.1 一个严格依赖的案例 104
4.5.2 倒置依赖 104
4.6 小结 106
第5章 用装饰器改进代码 107
5.1 Python中的装饰器是什么 107
5.1.1 装饰器函数 108
5.1.2 装饰类 109
5.1.3 其他类型的装饰器 113
5.1.4 将参数传递给装饰器 114
5.1.5 充分利用装饰器 117
5.2 有效的装饰:避免常见的错误 118
5.2.1 保存关于原始包装对象的数据 118
5.2.2 处理装饰器中的副作用 121
5.2.3 创建始终有效的装饰器 125
5.3 装饰器的DRY原则 128
5.4 装饰器和关注点分离 129
5.5 好的装饰器的相关分析 130
5.6 小结 132
第6章 用描述符从对象中获取更多信息 133
6.1 初探描述符 133
6.1.1 描述符背后的机制 133
6.1.2 研究描述符协议中的每个方法 136
6.2 描述符的类型 142
6.2.1 非数据描述符 143
6.2.2 数据描述符 145
6.3 描述符的实际应用 147
6.3.1 描述符的一种应用 147
6.3.2 实现描述符的不同形式 151
6.3.3 关于描述符的更多考虑 154
6.4 分析描述符 158
6.4.1 Python内部如何使用描述符 158
6.4.2 在装饰器中实现描述符 163
6.5 小结 164
第7章 使用生成器 165
7.1 技术要求 165
7.2 创建生成器 165
7.2.1 初探生成器 166
7.2.2 生成器表达式 168
7.3 惯用迭代 169
7.3.1 迭代的习惯用法 169
7.3.2 Python中的迭代器模式 175
7.4 协同程序 179
7.4.1 使用生成器接口的方法 179
7.4.2 更先进的协同程序 184
7.5 异步编程 191
7.6 小结 192
第8章 单元测试和重构 193
8.1 设计原则和单元测试 193
8.1.1 关于其他形式的自动化测试的说明 194
8.1.2 单元测试和敏捷软件开发 195
8.1.3 单元测试和软件设计 196
8.1.4 定义测试内容的边界 199
8.2 测试的框架和工具 200
8.2.1 用于单元测试的框架和库 200
8.2.2 代码覆盖率 209
8.2.3 模拟对象(Mock对象) 211
8.3 代码重构 216
8.3.1 代码演进 216
8.3.2 需要演进的不仅仅是生产代码 218
8.4 更多关于单元测试的信息 220
8.4.1 基于属性的测试 220
8.4.2 突变测试 221
8.5 测试驱动开发的简要介绍 223
8.6 小结 224
第9章 常见的设计模式 225
9.1 Python中设计模式的注意事项 225
9.2 有效的设计模式 227
9.2.1 创建型模式 227
9.2.2 结构型模式 233
9.2.3 行为模式 240
9.3 空对象模式 250
9.4 关于设计模式的最后想法 252
9.4.1 模式对设计的影响 252
9.4.2 模型中的名称 253
9.5 小结 254
第 10章 整洁架构 255
10.1 从整洁代码到整洁架构 255
10.1.1 关注点分离 256
10.1.2 抽象 257
10.2 软件组件 258
10.2.1 包 258
10.2.2 容器 261
10.3 用例 262
10.3.1 编码 263
10.3.2 服务 268
10.3.3 分析 271
10.4 小结 273
写在最后 274