6.1认识面向对象
所谓面向对象(Object Oriented),就是将真实世界的事物模块化,主要目的是提供软件的可重用性和可读性。面向对象概念的示意图如图下所示。
6.1.1 对象具有属性和方法
何谓对象?以我们生活的世界来说,人、车子、书本、房屋、电梯、大海和大山等都可视为对象。举例来说,想要购买一台电视机,品牌、尺寸大小、外观和功能可能是购买时要考虑的因素。品牌、尺寸和外观都可用来描述电视的特征,以对象观点来看,它具有属性(Attribute)。如果以“犬类”这个名词描述小狗,可能只有模模糊糊的印象,但是说它是一只拉布拉多犬,就会有较具体的描绘:体型高大、短毛,毛色可能是黄白或黑色。上述这些特征的描述可视为对象的属性。真实世界当然包含各种大大小小、形形色色的犬类,这也说明以面向对象技术来模拟真实世界的过程中,系统是多元的,它由不同的对象组成。
对象具有生命,表示对象内涵还包含行为(Behavior)。一只猫跳上了桌,却不慎碰翻了一杯水,所以行为是一种动态的表现。以手机来说,就是它具有的功能,随着科技的普及,照相、上网、实时通信等相关功能一般手机都有。以对象观点来看,就是方法(Method)。属性表现了对象的静态特征,方法则是对象动态的特写。
对象除了具有属性和方法外,还要有沟通方式。人与人之间借助语言的沟通来传递信息。那么对象之间如何进行信息的传递呢?以取钱的ATM(自动提款机)来说,放入银行卡,输入密码才能跟ATM进一步的沟通。如果将ATM视为对象,输入密码就是与ATM沟通的方法。输入数字按“确认”按钮之后,会把这些数字传送出去,以便建立提款机制。进一步来说,输入密码方法中传递的参数就是这些密码,信息正确无误才能获取提款的界面,即以方法作为参数传递,必须要有返回值。
6.1.2 类是对象的蓝图
面向对象应用于分析和系统设计时,称为面向对象分析(Object Oriented Analysis)和面向对象设计(Object Oriented Design)。
从前面的章节一路走来,可以看出Python是不折不扣的面向对象程序设计语言,想要认识它的魅力所在就要从面向对象开始着手。一般来说,类(Class)提供了实现对象的模型,编写程序时必须先定义类,设置成员的属性和方法。例如,盖房屋之前要有规划蓝图,标识坐落的方位,确定楼高多少,何处要有大门、阳台、客厅和卧室。蓝图规划的主要目的就是反映出房屋建造后的真实面貌。因此,可以把类视为对象原型,创建类之后还要具体化对象,称为实例化(Instantiation),经由实例化的对象称为实例(Instance)。类可以创建或生成不同状态的对象(见下图),每个对象也都是独立的实例。
6.1.3 抽象化概念
若要模拟真实世界,则必须把真实世界的东西抽象化为计算机系统的数据。在面向对象世界里,是以各个对象自行分担的功能来模块化的,基本上包含3个基本要素:数据抽象化(封装)、继承和多态(动态绑定)。
数据抽象化(Data Abstraction)以应用程序为目的来决定抽象化的角度,基本上就是“简化”实例功能。如果要描述一位朋友:身高可能是170厘米,体型高瘦,短发,脸上戴一副眼镜。这就是数据抽象化的结果,针对一些易辨认的特征将这个人的外观素描进行数据抽离。数据抽象化的目的是便于日后的维护,应用程序的复杂性越高,数据抽象化做得越好,越能提高程序的可重用性和阅读性。
日常生活中使用的手机也是如此。拨打电话可能按错数字,数据抽象化之后,手机的操作界面只有数字、确认键和取消键,将显示数字的属性和操作按键的行为结合起来就是封装(Encapsulation)。对于使用手机的人来说,并不需要知道数字如何显示,确保按下正确的数字键就好。操作模块在规范下,按数字键5不会变成数字键8。使用手机时,只能通过操作界面使用它的功能,外部无法更改它的按键功能,如此一来就能达到信息隐藏(Information Hiding)的目的。
存取范围和方法:创建抽象数据类型时包含两种存取范围:公有和私有。在公有范围,所定义的变量都能自由存取,但是在私有范围定义的变量只适用于它本身的抽象数据类型。由于外部无法存取私有范围的变量,因此这就是信息隐藏的一种表现方式。
若想要进一步了解对象的状态,则要通过其行为,这也是封装(Encapsulation)概念的由来。在面向对象技术里,对象的行为通常使用方法(Method)来表示,它定义了对象接收信息所对应的程序。
面向对象(object-oriented ;简称: OO) 至今还没有统一的概念 我这里把它定义为: 按人们 认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设 计、实现软件的办法。
面向对象编程(Object Oriented Programming-OOP) 是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。