面向对象程序设计
导学
面向对象程序设计(Object Oriented Programming,OOP)是一种将数据和对数据的操作封装成为“对象”来处理的程序设计方法。这种设计思想使得软件设计更加灵活,提高了代码的可读性和可扩展性。OOP可以在对象的基础上进行再抽象,根据不同对象之间的共同特征进行分类、抽象,形成类。OOP的关键就在于如何合理地定义和组织类以及类与类之间的关系。
了解:面向对象的程序设计思想。
掌握:对象、类的概念;面向对象程序设计的封装、继承和多态。
前面的章节介绍了数据、列表、元组、字典和序列等内容。本章将主要介绍Python中另一个非常核心的概念,即对象。和C 、Java等其他语言一样,Python被称为面向对象的语言。在对象之上,可以抽象出类的概念,类具有封装性、继承性和多态性。
5.1 面向对象程序设计基础
5.1.1 面向对象程序设计的基本概念
1.对象
对象(Object)是面向对象程序设计的核心,也是程序的主要组成部分。在面向对象的程序设计方法里,一个程序就可以看成是一组对象的集合。
在现实世界里,我们可以广义地认为,对象就是客观世界里存在着的任何事物。它可以是有生命的,也可以是无生命的;可以是具体的,也可以是抽象的。比如我们每一个人、我们身边的花草树木、桌椅板凳,都可以称为一个对象。任何对象都不仅包含它本身,同时也包含其所具有的特性和行为。
在面向对象的程序设计思想中,对象可以被看成是数据以及其具有的属性和存取、操作该数据的方法所构成的集合。所以,在这种设计方法中,只要将程序中包含的每一个对象设计完成,也就完成了整个程序的设计。
2.类
类(Class)是同一类型对象,也就是具有相似行为对象的集合和抽象。在面向对象程序设计中,对象是程序的基本单位,是一种复合的数据类型,是程序的基本要素。而类是将具有相同状态、行为和访问机制的多个对象抽象形成一个整体。在定义了一个类之后,符合类特点的对象称为类实例或类对象。类代表一般,而类中的一个对象代表具体。例如,如果将每一个人作为一个个体看成是一个对象,那么一类人群就可以称为一个“类”,比如男人是一类、女人是一类。
其实,不必将类的概念想象得那么复杂难以理解,我们可以把类简单地理解为类型,即数据类型。就像Python等语言允许用户创建除自带函数之外的自定义函数一样,Python也允许用户创建自定义的满足特殊条件的数据类型,就和Python定义好的string、list、dict等数据类型一样,没什么区别。
3.消息和方法
消息(Message)就是用来请求对象执行某一处理或是回答某些信息的要求。当对某一对象进行相应处理时,如果需要,可以通过传递消息,请求其他对象完成相应处理工作或者回答相应消息。其他对象在执行所要求的处理时,也可以通过传递消息与别的对象联系。因此,程序的执行其实是靠对象间消息的传递来实现的。消息的传送方称为发送者,消息的接收方��为接收者。
方法(Method)是类的行为和属性的总称,是允许作用在对象上的所有操作。因此,对数据进行处理就是通过类所具有的方法使用消息传递来实现的。
5.1.2 面向对象程序设计的基本特性
面向对象程序设计是一种计算机编程架构。根据前面对对象、类等概念的介绍,可以理解面向对象程序设计方法具有以下3个基本特性。
1.封装性(Encapsulation)
封装性就是将数据和数据的属性及对其可能进行的操作集合起来,形成一个整体,即对象。用户不必知道对象行为的实现细节,只需根据对象提供的外部特性接口对对象进行访问。这样,就可以实现将对象的用户和设计者分开,用户在使用对象时,不必知道对象行为的细节,只需调用设计者提供的协议命令就可以了。
另一方面,面向对象方法的封装性有效地使对象以外的事物不能随意获取对象的内部属性(公有属性除外),避免了外部错误对其产生的影响,大幅减少软件开发过程中查错的工作量,降低排错难度;同时隐蔽了程序设计的复杂性,提高了代码的重用性。
2.继承性(Inheritance)
提到继承性,就要先给出两个在类的继承过程中出现的新概念:父类(基类)和子类(派生类)。父类和子类是相对而言的,如果我们将已定义好的一个类称为父类,则从这个类派生出来的类就被称为这个类的子类。子类可以继承父类的所有属性。这种从父类派生出子类的现象称为类的继承机制,也就是继承性。
子类因为继承了父类的属性,所以在使用时无须重新定义父类中已经定义好的属性和行为,而是自动地拥有其父类的全部属性和行为。
3.多态性(Polymorphism)
面向对象程序设计的多态性是指子类在继承了父类中定义的属性或行为的基础上,可以再定义出其他个性化的属性或行为。
Python完全采用了OOP的思想,是真正面向对象的**动态编程语言,完全支持面向对象诸如封装、继承、多态以及派生类对基类方法的覆盖和重写等基本功能。
与其他面向对象程序设计语言不同的是,Python中对象的概念更加宽泛。在Python中,一切内容都可以称为对象,包括字符串、列表、字典和元组等内置数据类型都具有和类完全相似的语法和用法。
5.2 类 与 对 象
5.2.1 定义类和对象
在Python中,对象是类的实例,是由类创建的。所以在定义一个对象时,应该首先存在一个类。下面,我们就来分别定义类和对象。
1.定义类
创建类时,对象的属性用变量形式表现,称为数据成员或成员变量;对象的行为用函数形式表示,称为成员函数或成员方法。成员变量和成员方法统称为类的成员。
Python使用class关键字来定义类,class关键字之后是一个空格,后面跟类的名字,然后是一个冒号,*后换行并定义类的内部实现方法。注意,类名的首字母一般需要大写,虽然也可以按照自己的习惯风格来定义类名,但是一般还是**参考惯例来命名,并在整个系统的设计和实现中保持风格的一致,以此增强程序的可读性,也有利于团队合作。
下面给出定义类的*简单的格式:
class 类名:
属性(成员变量)
属性
…
…
成员函数(成员方法)
【例5-1】 定义一个“学校”类,取名为CMU,实现输出字符串“Welcome to China Medical University!”的作用。程序代码如下:
class CMU:
#定义成员函数Welcome()
def Welcome(self):
print("Welcome to China Medical University!")
xm=CMU() #定义类对象xm
xm.Welcome () #通过类对象调用成员函数
程序运行结果如下:
Welcome to China Medical University!
例题5-1在CMU类中定义了一个成员函数Welcome (self),目的用于输出字符串“Welcome to China Medical University!”
需要说明的是,在Python中,函数和成员函数是有区别的。成员函数一般指与特定实例绑定的函数,当用户通过对象调用成员函数时,对象本身将作为**个参数被传递过去,这是普通函数所不具备的特点。就如例题5-1中成员函数Welcome (self)中的参数self就是代表类对象本身的参数。在类的成员函数中访问实例属性时,需要以self为前缀。
2.定义对象
前面介绍过,类就是数据类型。那么,面向对象程序设计方法中,在类下声明的变量就是“类对象”“实例对象”“对象”“实例”,这些各种称呼来源于不同的程序设计语言,其中“类对象”和“实例对象”比较严格些,建议大家多多采用。
既然对象是类的实例,那么接着上面的例子,如果人类是一个类,那么某个具体的人就是一个对象。在定义了具体的对象之后,就可以通过使用“对象名.成员”的方式来访问其中的数据成员或者成员方法。
首先给出Python创建对象的语法格式:
对象名=类名()
在例题5-1中,就已经定义了一个CMU类的对象xm,并通过类对象来调用成员函数,具体代码如下:
xm=CMU() #定义类对象xm
xm.Welcome () #通过类对象调用成员函数
程序运行结果如下:
Welcome to China Medical University!