5.1.3 用对象表示复杂数据

程序是对数据进行操作的过程,因此数据表示和操作过程是编程时要考虑的两大问题。 我们已经熟悉用编程语言提供的数据类型来表示数据,例如用字符串表示雇员姓名,用整数表示年龄,用浮点数表示工资等。对于某些稍微复杂一点的数据我们也有适合的数据类 型来表示,例如雇员名单可以用一个字符串数据构成的列表来表示。当数据表示确定之后, 我们接着用各种数据类型所支持的数据操作来处理数据,例如对于工资数据可以执行加减乘 除操作,对于姓名数据可以分别抽取出姓和名。

先考虑数据的表示,然后再考虑对数据的操作,这就是迄今为止我们在编程序时常用的 思考方式。在这种思考方式下,数据和对数据的操作被看作是两件相互分离的事情,因而可 以分别考虑。例如,在一元二次方程求解程序中,我们先获得所需的数据(方程系数 a、b、 c),然后才去考虑对这些数据的操作过程,即先计算判别式的正负,再去求方程根。

然而还有另一种思考方式,那就是将数据和对数据的操作视为不可分离的,并将两者组 合在一起形成一个实体——对象(object)。显然,对象是对传统“数据”概念的发展:传统 数据只是存储一些信息,而对象中不但存储了一些信息,而且还掌握了对这些信息的操作。 在面向对象术语中,对象的数据称为属性,对象的操作称为方法。

以一个简单数据"Lu Chaojun"为例,在传统观点下,可用字符串类型来表示这个数 据:

name = "Lu Chaojun"

现在,数据 name 仅仅存储了一个姓名,对这个数据能执行什么操作不由 name 决定,而是 由程序的其他部分决定。例如,如果希望按西方习惯将姓放在名的后面显示,则程序中可以 对 name 进行如下操作:

lastname = name[0:2] 
firstname = name[3:] 
print firstname,lastname

而在对象观点下,我们将把 name 和能对 name 执行的操作相结合,形成一种对象(如图 5.1 所示 ),该对象 不但存储了 信息 "Lu Chaojun" ,而且还拥有 对信息的操 作last_first()、first_last()、first()、last()等。这种对象本质上仍然是 name数据,而且是具有数据操作能力的数据。

图 5.1 对象:数据与操作相结合

总之,一个对象不但知道一些信息,并且还负责操作这些信息。要想对对象的数据执行特定操作,只需向对象发出请求消息,由对象来执行所需的方法。 对象概念通常并不是用来描述如上例那样的简单数据的。事实上,对象概念主要用于描述复杂数据、设计复杂系统。对象将若干相关数据连同若干操作组合在一起,形成一种结构单元,从而复杂系统可以方便地设计成由许多对象组成,对象之间通过交互、协作来完成系 统功能。

图形应用程序涉及图形这样的复杂数据以及对图形的各种操作,因此非常适合采用面向 对象概念。许多语言的图形库都是面向对象风格的,其中包括我们将介绍的 Python 标准图 形库 Tkinter。