前 言
本书主要介绍Python语言的高级特性,特别是如何编写高质量的Python程序。这通常意味着编写高性能且拥有良好可维护性的程序。同时,我们也会探究不同的设计方案并确定究竟是哪种方案提供了最佳性能。而对于一些正在寻找解决方案的问题,这也是一种很好的方式。
本书的大部分内容将介绍一种给定设计的不同替代方案。一些方案性能更好,另一些方案更加简单或者更加适合于特定领域的问题。最重要的是,找到最好的算法和最优的数据结构,以最少的开销换取最大的价值。时间就是金钱,高效的程序会为它们的用户创造更多的价值。
Python的很多内部特性都可以直接被应用程序所使用。这意味着,我们的程序可以与Python现有的特性非常好地整合。充分利用这些Python特性,可以让我们的面向对象设计整合得很好。
我们经常会为一个问题寻找多种不同的解决方案。当你评估不同的算法和数据结构时,通常会设计几种不同的方案,它们在性能和内存的使用上不尽相同。通过评估不同的方案,最终合理地优化应用程序,这是一种重要的面向对象设计技巧。
本书一个更为重要的主题是,对于任何问题,没有所谓的唯一且最好的方法。相反,会有许多不同的方案,而这些方案也各有优劣。
关于编程风格的主题非常有趣。敏锐的读者会注意到,在一些非常细微的部分,例如在名称选择和符号的使用上,并非所有的例子都完全符合PEP-8。
随着你能够越来越熟练地以面向对象的方式使用Python,也将不得不花大量的时间去阅读各种Python源码。你会发现,甚至在Python标准库的模块中,都有很大的可变性。相比于展示完全一致的例子,我们更倾向于去关注那些不一致的部分,正如我们在各种开源项目中所看到的,一致性的缺乏,正是对代码更好的认可。
目 录
[第1部分 用特殊方法实现Python风格的类
第1章 __init__()方法
1.1 隐式的基类——object](/)
1.2 基类中的__init__()方法
1.3 在基类中实现init()方法
1.4 使用__init()__方法创建常量清单
1.5 通过工厂函数调用__init()__
1.5.1 错误的工厂设计和模糊的else语句
1.5.2 使用elif简化设计来获得一致性
1.5.3 使用映射和类来简化设计
1.6 在每个子类中实现__init()__方法
1.7 简单的组合对象
1.7.1 封装集合类
1.7.2 扩展集合类
1.7.3 可适应更多需求的另一种设计
1.8 复合的组合对象
1.9 不带__init__()方法的无状态对象
1.10 一些其他的类定义
1.11 多策略的__init__()方法
1.11.1 更复杂的初始化方式
1.11.2 静态函数的初始化
1.12 更多的__init__()技术
1.12.1 带有类型验证的初始化
1.12.2 初始化、封装和私有化
1.13 总结
[第2章 与Python无缝集成——基本特殊方法
2.1 __repr__()和__str__()方法](/)
2.1.1 非集合对象的__str__()和__repr__()
2.1.2 集合中的__str__()和__repr__()
2.2 __format__()方法
2.2.1 内嵌格式规范
2.2.2 集合和委托格式规范
2.3 __hash__()方法
2.3.1 决定哈希的对象
2.3.2 有关不可变对象和继承的默认行为
2.3.3 重载不可变对象
2.3.4 重载可变对象
2.3.5 从可变的Hand类中生成一个不可变的Hand类
2.4 __bool__()方法
2.5 __bytes__()方法
2.6 比较运算符方法
2.6.1 设计比较运算
2.6.2 实现同一个类的对象比较
2.6.3 实现不同类的对象比较
2.6.4 硬总和、软总和和多态
2.6.5 不同类比较的例子
2.7 __del__()方法
2.7.1 引用计数和对象销毁
2.7.2 循环引用和垃圾回收
2.7.3 循环引用和weakref模块
2.7.4 __del__()和close()方法
2.8 __new__()方法和不可变对象
2.9 new()方法和元类型
2.9.1 元类型示例1——有序的属性
2.9.2 元类型示例2——自引用
2.10 总结
第3章 属性访问、特性和修饰符
第4章 抽象基类设计的一致性
第5章 可调用对象和上下文的使用
第6章 创建容器和集合
第7章 创建数值类型
第8章 装饰器和mixin——横切方面
第2部分 持久化和序列化
第9章 序列化和保存——JSON、YAML、Pickle、CSV和XML
第10章 用Shelve保存和获取对象
第11章 用SQLite保存和获取对象
第12章 传输和共享对象
第13章 配置文件和持久化
第3部分 测试、调试、部署和维护
第14章 Logging和Warning模块
第15章 可测试性的设计
第16章 使用命令行
第17章 模块和包的设计
第18章 质量和文档