欢迎光临散文网 会员登陆 & 注册

第九章 面向对象-1

2023-07-11 11:00 作者:wangyanhpa  | 我要投稿

面向对象编程是适合于编写游戏软件或者大型软件采用的一种程序设计方法,软件开发人员一般采用这种方法,也就是说这是高手用的。如果只是简单的编程入门课程或者只是为了参加计算机等级考试,这部分内容可以不看了,因为计算机等级考试Python里没有面向对象的内容。所以面向对象这部分可以略过不看,直接跳过吧!

 --------------------------------------------------------------------------------------

 知道你好奇还要往下看,看看也好,反正这里是“小白入门”,介绍的比较简单比较基础,了解了解吧,以后也有点儿谈资!

 

Python里“万物皆对象”。什么意思?不管这个,先看下面例子。

n=3

print(n,type(n))           #3 < class 'int'>

f=3.14

print(f,type(f))           #3.14 <class 'float'>

s="cup"

print(s,type(s))          # cup <class 'str'>

print(s.find("u"))         # 1

print(s.upper())          # CUP

 

n, f和s是我们熟悉的数据类型,大家看一下type函数的输出都是 <class '*'>,这里的class是什么意思?类!类和对象的类。所以我们之前学习了int类--class 'int',float类-- class 'float'和str类-- class 'str'。s="cup"是str字符串类型的对象,同样n=3是int类型的对象,f=3.14是float类型的对象。所以可以总结出来具体的数值可以理解为该类型的对象,对象是一个一个确定的实体,类是具有具体数值的一个个实体的抽象。不懂,没有关系,接着往下看。下面10个是什么形状?

小学生回答“三角形”。我们看到的是一个一个具体的形状(对象的概念),回答的时候根据它们的共性把它们抽象为“三角形”(类的概念)。现在是不是有一丝丝的理解了?再看下面一剂猛药例子。

上面这些是什么呢?动物!动物是由上面一个个具体的小可爱抽象出来的类的概念,动物是类,上面一个个的是动物类的对象。好了,该你举一个例子了。什么是类,什么是对象。

分类是人们认识世界的方法,通过分类可以更好的了解世界。利用分类,我们可以通过已知推测未知,比如当我们说一种东西是“一种植物”时,你肯定不会想到这种东西可以像动物一样吃别的东西,除非下面这些特殊的植物。

程序设计分为两种类型:面向过程的程序设计面向对象的程序设计。面向过程的程序设计语言如C语言,面向对象的程序设计语言如C++语言、Java语言和Python。

面向过程和面向对象有什么区别呢?个人的理解是,面向过程是把问题划分为几个步骤,抽象出每个步骤的功能称为函数,然后依次调用这些函数,解决问题。而面向对象则是根据具体问题,将不同实体类型抽象为不同的类,类有自己的属性和方法,通过定义类的对象调用方法解决问题。

以学生成绩综合测评为例比较说明两种不同程序设计方法。假设我们要输入10名同学三门课的成绩,然后计算每个人总分并排序。如果采用面向过程的程序设计,我们要考虑的是定义如下几个函数。

finput_score:实现成绩录入,并保存10名同学的姓名和每门课程成绩数据。

fget_totalscore:实现计算每个人的总分,并保存10名同学三门课程总分。

fsort_score:实现10名同学总分成绩从高到低排序。

fdisplay:显示10名同学姓名和成绩信息。

编程按照顺序依次调用上面函数即可完成要求的功能。

如果采用面向过程的程序设计,考虑的是学生实体我们关注的信息有三门课的成绩,我们不关注学生的身高体重信息,身高体重跟我们要解决的问题没有关系。我们要定义一个学生类,这个学生的属性有姓名和三门课的成绩,学生类的方法(方法就是类里面定义的函数)有:输入三门课成绩、计算三门课总分、显示学生信息。但是排序属于要处理多个学生的信息,所以不能设计为学生类的方法,我们还需要编写一个类外的函数用于多个学生的总分进行排序。

如果还想继续深入理解请继续阅读下面斜体内容,只想一知半解了解的请直达知识点9.1类的定义。


【下述到本节结尾参考网络资料】

面向过程编程与面向对象编程体现了编程者的两种不同的思维方式,本节教程主要介绍面向过程编程与面向对象编程的区别和联系。

面向过程是一种以过程为中心的编程思想,它首先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,在使用时依次调用,是一种基础的顺序的思维方式。

面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的编程思想,通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。

面向对象方法直接把所有事物都当作独立的对象,处理问题过程中所思考的不再主要是怎样用数据结构来描述问题,而是直接考虑重现问题中各个对象之间的关系。面向对象方法的基础实现中也包含面向过程的思想。

具体来说,面向对象与面向过程有以下四个方面的不同:

(1)出发点不同

面向对象使用符合常规思维的方式来处理客观世界的问题,强调把解决问题领域的“动作”直接映射到对象之间的接口上。而面向过程则强调的是过程的抽象化与模块化,是以过程为中心构造或处理客观世界问题。

(2)层次逻辑关系不同

面向对象使用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类作为处理问题的单位,尽可能地使计算机世界向客观世界靠拢,以使处理问题的方式更清晰直接,面向对象使用类的层次结构来体现类之间的继承与发展。面向过程处理问题的基本单位是能清晰准确地表达过程的模块,用模块的层次结构概括模块或模块间的关系与功能,把客观世界的问题抽象成计算机可以处理的过程。

(3)数据处理方式与控制程序方式不同

面向对象将数据与对应的代码封装成一个整体,原则上其他对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成,控制程序方式上是通过“事件驱动”来激活和运行程序的。而面向过程是直接通过程序来处理数据,处理完毕后即可显示处理的结果,在控制方式上是按照设计调用或返回程序,不能自由导航,各模块之间存在着控制与被控制,调动与被调用的关系。

(4)分析设计与编码转换方式不同

面向对象贯穿于软件生命周期的分析、设计及编码中,是一种平滑的过程,从分析到设计再到编码是采用一致性的模型表示,实现的是一种无缝连接。而面向过程强调分析、设计及编码之间按规则进行转换贯穿于软件生命周期的分析、设计及编码中,实现的是一种有缝的连接。

面向对象的编程方法有四个基本特性:

(1)抽象:就是忽略一个主题中与当前目标无关的方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中相关的一部分。抽象包括两个方面,一是过程抽象,二是数据抽象。

过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值,只能通过使用这些操作修改和观察。

(2)继承:这是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。

派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。这也体现了大自然中一般与特殊的关系。继承性很好地解决了软件的可重用性问题。

(3)封装:就是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象的计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。

在这个阶段定义对象的接口。通常,应禁止直接访问一个对象的实际表示,而应通过操作接口访问对象,这称为信息隐藏。封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。

(4)多态:是指允许不同类的对象对同一消息做出响应。比如同样的鼠标双击操作,在字处理程序和音频播放程序或者视频播放剩下中有不同的效果。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序函数同名问题。  

为了进一步理解面向对象和面向过程的不同,以设计一个五子棋程序为例,面向过程的设计思路是,首先分析问题的步骤:① 开始游戏;② 黑子先走;③ 绘制画面;④ 判断输赢;⑤ 轮到白子;⑥ 绘制画面;⑦ 判断输赢;⑧ 返回步骤 ②;⑨ 输出最后结果,然后将上面每个步骤用程序来实现即可。

面向对象的设计则将程序分为三类对象:① 黑白双方,这两方的行为是一模一样的;② 棋盘系统,负责绘制画面;③ 规则系统,负责判定诸如犯规、输赢等。第 ① 类对象(玩家对象)负责接受用户输入,并告知第 ② 类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第 ③ 类对象(规则系统)来对棋局进行判定。

可见,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。功能上的统一保证了面向对象设计的可扩展性。

如要加入悔棋功能,若是面向过程设计,则从输入到判断到显示的若干步骤都要改动,甚至步骤之间的先后顺序都可能需要调整。而若是面向对象设计,则只需改动第 ② 类对象(棋盘对象)即可,棋盘对象保存了黑白双方的棋谱和落子先后顺序,简单回溯操作即可实现悔棋功能,并不涉及显示和规则部分,改动是局部可控的。



第九章 面向对象-1的评论 (共 条)

分享到微博请遵守国家法律