python 魔术方法和哈希类型、使用抽象数据类型设计程序

181 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

魔术方法和哈希类型

Python 的设计目标之一是允许程序员使用类来定义与 Python 的内置类型一样易于使用的新类型。使用 magic 方法提供内置函数(如 str 和 len)的特定于类的定义在实现此目标方面起着重要作用。

Magic 方法还可用于为中缀运算符(如 == 和 +)提供特定于类的定义。可用于中缀运算符的方法的名称为

image.png

image.png

您可以将所需的任何实现与这些运算符相关联。如果你愿意,你可以实现+作为减法,<作为幂,等等。但是,我们建议您拒绝有机会发挥想象力,并坚持与这些运算符的传统含义一致的实现。

image.png

运行图 10-2 中的代码时,将打印

image.png

我们可以使用Toy的实例作为字典键,因为我们为类定义了一个哈希函数。如果我们定义了一个

eq 函数和未定义的

hash_function,当我们尝试使用t1和t2作为键创建字典时,代码会生成错误消息不可哈希类型:“Toy”。当提供用户定义的哈希时,它应确保对象的哈希值在该对象的整个生存期内是恒定的。未显式定义 eq 的用户定义类的所有实例

对 == 使用对象标识,并且是可哈希的。如果未提供哈希方法,则对象的哈希值派生自对象的标识(请参阅第 5-3 节)。

手指练习:将添加到Int_set的并集方法替换为允许Int_set客户端使用 + 运算符来表示集合并集的方法。

使用抽象数据类型设计程序

抽象数据类型是一件大事。它们导致了一种不同的思维方式来组织大型项目。当我们思考世界时,我们依赖于抽象。在金融界,人们谈论股票和债券。在生物学领域,人们谈论蛋白质和残基。当试图理解诸如此类的概念时,我们在精神上将这类对象的一些相关数据和特征收集到一个智力包中。例如,我们认为债券具有利率、到期日和价格作为数据属性。我们还认为债券具有“设定价格”和“计算到期收益率”等操作。抽象的数据类型允许我们将这种组织纳入程序的设计中。

数据抽象鼓励程序设计人员关注数据对象的中心性,而不是函数的中心性。将程序更多地视为类型的集合而不是函数的集合,这导致了一个截然不同的组织原则。除此之外,它鼓励我们将编程视为组合相对较大块的过程,因为数据抽象通常包含比单个函数更多的功能。这反过来又导致我们将编程的本质视为不是编写单个代码行的过程,而是编写抽象的过程。

可重用抽象的可用性不仅减少了开发时间,而且通常会导致更可靠的程序,因为成熟软件通常比新软件更可靠。多年来,唯一常用的程序库是统计或科学。然而,今天,有大量的可用程序库(特别是对于Python),通常基于一组丰富的数据抽象,我们将在后面看到。