本书将向您介绍 Python 编程语言的许多高级特性。重点是尽可能创建最高质量的 Python 程序。这需要探索设计备选方案,并确定哪种设计能够提供最佳性能,同时仍然非常适合正在解决的问题。
这本书的大部分展示了给定设计的许多备选方案。有些将提供更好的性能,而有些将看起来更简单或是问题域的更好解决方案。为了以最少的计算机处理创造最大的价值,找到最佳算法和最佳数据结构是至关重要的。时间就是金钱,节省时间的程序将为用户创造更多价值。Python 使许多内部功能直接可用于我们的应用程序。这意味着我们的程序可以与现有的 Python 特性紧密集成。我们可以通过确保我们的面向对象设计(OODs良好集成来利用众多 Python 功能。
当我们探索不同的算法和数据结构时,我们将发现不同的内存和性能替代方案。能够通过替代解决方案来正确优化最终应用程序是一项重要的 OOD 技能。这本书的一个更重要的主题是,对于任何问题都没有单一的最佳方法。
尽可能多的示例都有完整的类型提示。一些示例依赖于标准库之外的包,您会发现类型提示缺失或不完整。必须使用mypy工具处理示例,以确认一致使用类型。
随着我们逐渐掌握面向对象的 Python,我们将花费大量时间从各种来源阅读 Python 代码。即使在 Python 标准库模块中,我们也将观察到广泛的可变性。我们没有给出完全一致的例子,而是选择了一些不一致的例子;缺乏一致性将有助于阅读各种代码,就像在野外遇到的各种开源项目一样。
这本书使用了高级 Python。您需要相对熟悉 Python 3。当你有自己的问题需要解决时,学习一门编程语言是很有帮助的。
如果您是其他语言的熟练程序员,那么如果您想切换到 Python,您可能会发现这本书很有用。请注意,本书没有介绍任何语法或其他基本概念。
Python2 程序员在切换到 Python3 时可能会发现这一点特别有用。我们将不介绍任何转换实用程序(如2to3工具)或任何共存库(如six
模块)。这本书完全关注 Python 3 的新开发。
在本书中,我们将涵盖高级 Python 主题的三个广泛领域。每个主题将分为一系列章节,研究各种细节。
第 1 节通过特殊方法进行更紧密的集成,深入研究面向对象编程(OOP技术,以及我们如何将应用程序的类定义与 Python 的内置功能更紧密地集成。本节共分九章,内容如下:
- 第一章、预备、工具和技术*、*涵盖了一些预备主题,如
unittest
、doctest
、docstring
以及一些特殊的方法名称。 - 第 2 章*中的【初始化方法】*为我们提供了
_init_()
方法的详细描述和实现。我们将研究简单对象的不同初始化形式。接下来,我们可以探索涉及集合和容器的更复杂的对象。 - 第 3 章无缝集成–基本特殊方法**详细说明了如何扩展一个简单的类定义来添加特殊方法。我们需要查看从对象继承的默认行为,以便了解需要哪些重写以及何时实际需要它们。
** 第 4 章属性访问、属性和描述符详细探讨了默认处理是如何工作的。在这里,我们将学习如何决定何时何地覆盖默认行为。我们还将探索描述符,并更深入地了解 Python 的内部工作原理。* 第 5 章一致设计的 ABC检查
collections.abc
模块中的抽象基类。在本章中,我们将了解我们可能要修改或扩展的各种容器和集合背后的一般概念。类似地,我们将了解我们可能想要实现的数字背后的概念。- 第 6 章使用可调用对象和上下文揭示了使用
contextlib
中的工具创建上下文管理器的几种方法。我们将演示一些可调用对象的变体设计。这将向您展示为什么有状态可调用对象有时比简单函数更有用。在开始编写自己的上下文管理器之前,我们还将探讨如何使用一些现有的 Python 上下文管理器。* 第 7 章创建容器和集合重点介绍容器类的基础知识。我们将回顾创建容器所涉及的各种特殊方法以及容器提供的各种特性。我们将讨论扩展内置容器以添加功能。我们还将研究包装内置容器以及通过包装将方法委派给底层容器。* 第 8 章创建数字涵盖了以下基本算术运算符:+
、-
、*
、/
、//
、%
和**
。我们还将探讨这些比较运算符:<
、>
、<=
、>=
、==
和!=
。最后,我们将总结一些用于扩展或创建新数字的设计考虑。* 第 9 章、修饰符和混合-横切方面涵盖了简单函数修饰符、带参数的函数修饰符、类修饰符和方法修饰符。*
- 第 6 章使用可调用对象和上下文揭示了使用
*第 2 节、对象序列化和持久化探讨了已序列化到存储介质的持久化对象;也许它已转换为 JSON 并写入文件系统。ORM 层可以将对象存储在数据库中。本节将研究处理持久化的备选方案。全文共分五章,具体内容如下:
-
第 10 章序列化和保存–JSON、YAML、Pickle、CSV 和 XML介绍了使用侧重于各种数据表示(如 JSON、YAML、Pickle、XML 和 CSV)的库进行简单持久化。
-
第 11 章通过 Shelve存储和检索对象,解释了 Python 模块的基本数据库操作,如 Shelve(和 dbm)。
-
第 12 章通过 SQLite存储和检索对象,揭示了 SQL 和关系数据库更复杂的世界。因为 SQL 特性与 OOP 特性不匹配,所以存在阻抗不匹配问题。一个常见的解决方案是使用 ORM 来允许我们持久化一个大的对象域。SQLAlchemy 包将用作许多可用的 ORM 的示例。
-
第 13 章传输和共享对象介绍了用于传输对象的 HTTP 协议、JSON、YAML 和 XML 表示。
-
第 14 章配置文件和持久化介绍了 Python 应用程序使用配置文件的各种方式。
-
第 15 章设计原则和模式回顾了实体设计原则。通过遵循一些最佳实践,它们可以帮助组织高质量、可维护的 Python 软件。
第 3 节面向对象测试与调试向您展示了如何收集数据以支持和调试您自己的高性能程序。它包括有关创建最佳文档的信息,以减少支持的混乱和复杂性。本节包含最后五章,如下所示:
- 第 16 章日志和警告模块介绍了如何使用日志和警告模块创建审计信息,以及如何调试。此外,我们将在使用
print()
函数之外迈出重要的一步。 - 第 17 章可测试性设计介绍了可测试性设计,并演示了如何使用
unittest
和doctest
。 - 第 18 章,处理命令行,介绍如何使用
argparse
模块解析选项和参数。我们将更进一步,使用命令设计模式创建可以组合和扩展的程序组件,而无需编写 shell 脚本。 - 第 19 章模块及封装设计涵盖模块及封装设计。这是一组更高层次的考虑因素;我们将查看模块中的相关类和包中的相关模块。
- 第 20 章质量和文档探讨了我们如何记录我们的设计,以建立某种信任,即我们的软件是正确的,并且已经正确实施。
为了编译和运行本书中的示例,您需要以下软件:
-
Python 版本 3.7 或更高版本,带有标准库套件:
- 我们将使用mypy检查类型提示(http://mypy-lang.org )。
-
我们将查看这些附加包:
-
Pyaml(http://pyyaml.org )。
-
SQLAlchemy(http://www.sqlalchemy.org :建造时,仔细检查安装指南。具体参见https://docs.sqlalchemy.org/en/12/intro.html#installing-有关通过禁用 c 扩展来简化安装的信息,请参阅-c 扩展。
-
烧瓶(http://flask.pocoo.org )。
-
金贾(http://jinja.pocoo.org/ )。
-
PyTest(https://docs.pytest.org/en/latest/ )。
-
斯芬克斯(http://sphinx-doc.org )。
-
-
或者,您可能希望使用黑色工具一致地格式化代码(https://black.readthedocs.io/en/stable/ )。
-
此外,本书代码的整个测试套件是使用tox工具(运行的 https://tox.readthedocs.io/en/latest/ )。
您可以从您的账户www.packt.com下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packt.com/support并注册,将文件通过电子邮件直接发送给您。
您可以通过以下步骤下载代码文件:
- 登录或注册www.packt.com。
- 选择“支持”选项卡。
- 点击代码下载和勘误表。
- 在搜索框中输入图书名称,然后按照屏幕上的说明进行操作。
下载文件后,请确保使用以下最新版本解压或解压缩文件夹:
- WinRAR/7-Zip for Windows
- 适用于 Mac 的 Zipeg/iZip/UnRarX
- 适用于 Linux 的 7-Zip/PeaZip
该书的代码包也托管在 GitHub 上的https://github.com/PacktPublishing/Mastering-Object-Oriented-Python-Second-Edition 。如果代码有更新,它将在现有 GitHub 存储库中更新。
我们的丰富书籍和视频目录中还有其他代码包,请访问**https://github.com/PacktPublishing/** 。看看他们!
访问以下链接查看正在执行的代码:
本书中使用了许多文本约定。
CodeInText
:表示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。下面是一个示例:“将下载的WebStorm-10*.dmg
磁盘映像文件作为系统中的另一个磁盘装载。”
代码块设置如下:
def F(n: int ) -> int :
if n in ( 0 , 1 ):
return 1
else :
return F(n- 1 ) + F(n- 2 )
当我们希望提请您注意代码块的特定部分时,相关行或项目以粗体显示:
def factorial(n: int ) -> int :
"""Compute n! recursively.
:param n: an integer >= 0
:returns : n!
Because of Python's stack limitation, this won't
compute a value larger than about 1000!.
>>> factorial(5)
120
"""
任何命令行输入或输出的编写方式如下:
$ python3 -m pip install --upgrade pip
$ python3 -m pip install black
粗体:表示您在屏幕上看到的新术语、重要单词或单词。例如,菜单或对话框中的单词出现在文本中,如下所示。下面是一个示例:“从管理面板中选择系统信息。”
Warnings or important notes appear like this. Tips and tricks appear like this.
我们欢迎读者的反馈。
一般反馈:如果您对本书的任何方面有疑问,请在邮件主题中注明书名,并发送电子邮件至 [email protected]
。
勘误表:尽管我们已尽一切努力确保内容的准确性,但还是会出现错误。如果您在本书中发现错误,如果您能向我们报告,我们将不胜感激。请访问www.packt.com/submit-errata,选择您的书籍,点击 errata 提交表单链接,并输入详细信息。
盗版:如果您在互联网上发现我们作品的任何形式的非法复制品,请您提供我们的位置地址或网站名称,我们将不胜感激。请通过[email protected]
与我们联系,并提供该材料的链接。
如果您有兴趣成为一名作家:如果您对某个主题有专业知识,并且您有兴趣撰写或贡献一本书,请访问authors.packtpub.com。
请留下评论。一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢?然后,潜在读者可以看到并使用您的无偏见意见做出购买决定,我们 Packt 可以了解您对我们产品的看法,我们的作者可以看到您对他们书籍的反馈。非常感谢。
有关 Packt 的更多信息,请访问Packt.com。*