Logo
Section 1 / 18

类型提示

了解 Python 中的类和类型。

导入

类型提示

了解 Python 中的类和类型。

我们手头已有设计,现在准备将这一设计转化为可运行的程序。当然,实际情况通常并非如此顺利。在课程中,我们会看到许多关于良好软件设计的示例和提示,但我们的重点是面向对象编程。因此,让我们来看看 Python 语法中用于创建面向对象软件的功能。

完成本章后,我们将理解以下内容:

  • Python 的类型提示
  • 在 Python 中创建类并实例化对象
  • 将类组织成包和模块
  • 如何建议他人不要随意修改对象的数据,从而破坏其内部状态
  • 如何使用来自 Python 包索引(PyPI)的第三方包

引入类型提示

在深入探讨如何创建类之前,我们需要先简单了解一下什么是类,以及如何确保我们正确地使用了它。核心思想是:Python 中的一切都是对象。

当我们编写字面量值如 "Hello, world!" 或 42 时,实际上是在创建内置类的实例。我们可以启动交互式 Python 环境,并使用内置的 type() 函数来查看这些对象所属的类:

1print(type("Hello, world!")) 2print(type(42))

面向对象编程的核心思想是通过对象之间的交互来解决问题。当我们写 6 * 7 时,两个对象的乘法操作是由内置 int 类的一个方法处理的。对于更复杂的逻辑行为,我们通常需要编写全新的、独特的类。

以下是 Python 对象工作的两条基本原则:

  • Python 中的一切都是对象
  • 每个对象都至少是某个类的实例

这两条规则带来了许多有趣的后果。我们使用 class 语句定义的类,会创建一个 class 类型的新对象。当我们创建一个类的 实例 时,该类对象会被用来创建并初始化这个实例对象。

class 与 type 的区别

class 和 type 之间有什么区别?class 语句用于定义新的类型。由于我们使用的是 class 语句,因此在文中我们将它们统称为“类”。

注意:“类”和“类型”是同一概念的两种称呼。

我们将遵循常用说法,把这类注解称为“类型提示”。还有一个重要规则:

一个 变量 是对某个对象的引用。可以想象一张黄色便签纸,上面写着名字,贴在一个物体上。

这看起来似乎并不惊人,但实际上非常巧妙。这意味着对象的类型信息——即对象是什么——由与之关联的类决定。这种类型信息并不与变量本身绑定。这就导致了如下代码虽然合法却极易引起混淆:

1a_string_variable = "Hello, world!" 2print(type(a_string_variable)) 3 4a_string_variable = 42 5print(type(a_string_variable))

我们首先用内置类 str 创建了一个对象,并为其分配了一个较长的名字 a_string_variable。接着,我们又用另一个内置类 int 创建了一个新对象,并将同一个名字赋给了它。(之前的字符串对象因不再有引用而被销毁。)

以下是两个步骤的对比图示,展示了变量如何从一个对象转移到另一个对象:

...
变量名与对象

对象的各种属性属于对象本身,而不是变量。当我们用 type() 检查变量的类型时,看到的是该变量当前所引用的对象的类型。变量本身并没有类型;它仅仅是一个名称。同样,调用 id() 获取的是变量所指向对象的标识符。因此,如果我们将变量名 a_string_variable 赋给一个整数对象,这个名字就显得有些误导了。

面向对象设计

类型检查