5-1-oop-宏伟蓝图

类是 Python 的程序组成单元,是封装逻辑和数据的另一种方式。类有三个重要的独到之处:

  • **多重实例。**每次调用一个类,就会产生一个有独立命名空间的新对象。
  • 通过继承进行定制。
  • 运算符重载。

1. 概览 OOP

1.1 属性继承搜索

Python 中大多数 OOP 的故事,都可简化成以下表达式:

1
object.attribute

当我们对 class 语句产生的对象使用这种方式时,这个表达式会在 Python 中启动搜索——搜索对象连接的树,来寻找 attribute 首次出现的对象。当类启用时,上边的 Python 表达式实际上等于下列自然语言:

找出 attribute 首次出现的地方,先搜索 object,然后是该对象之上的所有类,由上至下,由左至右。

我们称这种搜索程序为继承,树中位置较低的对象继承了树中位置较高的对象拥有的属性。当从下至上进行搜索时,连接至树中的对象就是树中所有上层对象所定义的所有属性的集合体,直到树的最顶端。

1.2 类和实例

类和实例是两种不同的对象类型,主要差异在于,类是一种产生实例的工厂,内存中特定模块只有一个实例,对类而言,只要有需要,制作多少实例都可以。

1.3 类方法调用

如果 I2.w 引用是一个函数调用,其实际的含义是“调用 C3.w 函数以处理 I2”。Python 会自动将 I2.w() 调用映射为 C3.w(I2) 调用,传入该实例作为继承的函数的第一个参数。

1.4 编写类树

  • 每个 class 语句会生成一个新的类对象。
  • 每次类调用时,就会生成一个新的实例对象。
  • 实例自动连接至创建了这些实例的类。
  • 类连接至其超类的方式是,将超类列在类头部的括号内。其从左至右的顺序会决定树中的次序。

属性通常是在 class 语句中通过赋值语句添加在类中,而不是嵌入在函数的 def 语句内;属性通常是在类内,对传给函数的特殊参数(也就是 self),做赋值运算而添加在实例中的。

1