Python-第八章面向对象编程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2019/12/61Python语言编程导论第八章面向对象编程内容提要•面向对象程序设计方法的由来•类和对象•属性和方法•继承2019/12/62一、面向对象程序设计方法的由来1、面向过程的程序设计方法•最早的程序:–目的:用于数学计算–主要工作:设计求解问题的过程–缺点:对于庞大、复杂的程序难以开发和维护2019/12/63面向过程程序设计基本步骤:•分析程序从输入到输出的各步骤•按照执行过程从前到后编写程序•将高耦合部分封装成模块或函数•输入参数,按照程序执行过程调试2019/12/64面向过程的程序设计特点:•过程化程序设计的典型方法是“结构化程序设计”方法,是由荷兰学者Dijkstra在70年代提出的。•程序设计原则:自上而下、逐步求精、模块化编程等。•程序结构:–按功能划分为若干个基本模块。–各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。–其模块化实现的具体方法是使用子程序(过程/函数)。2019/12/65面向过程的程序设计特点(续):•程序组成:由传递参数的函数集合组成,每个函数处理它的参数,并可能返回某个值。即:主模块+子模块,它们之间以数据作为连接(程序=算法+数据结构)。•程序特点:程序是以过程为中心的。程序员必须基于过程来组织模块。数据处于次要的地位,而过程是关心的重点。•优点:有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。2019/12/66三种程序基本结构2019/12/67顺序循环选择面向过程的程序设计缺点:•数据与处理数据的方法(函数)相分离。一旦问题(数据)改变,程序员则需要改写或重新编写新的解决方法(功能函数),有时几个关键的数据结构发生变化,将导致整个软件系统的结构崩溃。随着软件规模和复杂性的增长,这种缺陷日益明显。当程序达到一定规模后,为了修改一个小的错误,常可能引出多个大的错误,究其原因,问题就出在传统的程序设计方式上。一般适用于中小型的程序设计及编程应用。•管理的数据类型无法满足需要。当前的软件应用领域已从传统的科学计算和事务处理扩展到了其它的很多方面,如人工智能、计算机辅助设计和辅助制造等,所需处理的数据也已从简单的数字和字符串发展为记录在各种介质上并且有多种格式的多媒体数据,如数字、正文、图形、声音和影像等。数据量和数据类型的空前激增导致了许多程序的规模和复杂性均接近或达到了用结构化程序设计方法无法管理的程度。•可重用性差。只能以函数的方式实现代码重用,效率低,是手工作坊式的编程模式。作为软件公司,都希望设计的程序具有可重用性,即能否建立一些具有已知特性的部件,应用程序通过部件组装即可得到一个新的系统。2019/12/68例8-1:铅球飞行计算问题(使用面向过程方法)•功能要求:在给定不同的投掷角度和初始速度下,求解计算铅球的飞行距离。•设计流程(功能分解、逐步求精):–输入:铅球发射角度、初始速度(m/s)、初始高度(m)–处理:模拟铅球飞行,时刻更新铅球在飞行中的位置–输出:铅球飞行距离(m)2019/12/69简化问题:•忽略空气阻力•重力加速度9.8m/s2•铅球飞行过程–铅球高度–飞行距离•时刻更新铅球在飞行中的位置。–假设起始位置是点(0,0)–垂直方向上运动距离(y轴)–水平方向上移动距离(x轴)2019/12/610设计参数:•仿真参数:投掷角度angle、初始速度velocity、初始高度height、飞行距离interval•位置参数:x轴坐标xpos,y轴坐标ypos•速度分量:x轴方向上速度xvel,y轴方向上速度yvel2019/12/611根据提示输入仿真参数:2019/12/612计算初始速度:•x轴的速度–xvel=velocity*cos(theta)•y轴的速度–yvel=velocity*sin(theta)2019/12/613完整程序:2019/12/614程序模块化:2019/12/6152、面向对象程序设计方法•面向对象编程是一种组织程序的新型思维方式,软件设计的焦点不再是程序的逻辑流程,而是软件或程序中的对象以及对象之间的关系。–将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。–对同类型对象抽象出其共性,形成类。–类通过一个简单的外部接口,与外界发生关系。–对象与对象之间通过消息进行通信。2019/12/616面向对象程序设计方法优点:•程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。•通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。2019/12/6173、Python支持的编程方式•Python支持面向过程、面向对象、函数式编程等多种编程方式。•Python不强制使用任何一种编程方式,可以使用面向过程方式编写任何程序,在编写小程序(少于500行代码)时,不会有问题。但对于中等和大型项目来说,面向对象会带来很多优势。2019/12/6182019/12/619•Python对面向对象的语法进行了简化,去掉了面向对象中许多复杂的特性。例如,类的属性和方法的限制符—public、private、protected。Python提倡语法的简单、易用性,这些访问权限靠程序员自觉遵守,而不强制使用。例8-2:铅球飞行计算问题(使用面向对象方法)•设计流程:①定义出一个“投射体”类——描述投射体类的属性(铅球对象属性:xpos、ypos、xvel、yvel,铅球对象操作:更新投射体状态、返回投射体高度、返回投射体距离);②将此类(实例化)具体化以定义出一个对象(代表本次计算的问题);③向此对象发送一条消息——获取投射体的高度。反复进行此步骤,直到投射体高度为零(即已落地);④再向此对象发送一条消息——显示出投射距离。2019/12/620投射体类定义:2019/12/621引入对象,程序模块化:2019/12/622程序执行:•选手1技术强•铅球的出手角度41度•出手速度14米/秒•初始高度1.8米•仿真间隔0.3秒•铅球最远飞行距离22.2.米•选手2力量大•铅球的出手角度30度•出手速度15米/秒•始高度2米•仿真间隔0.3秒•铅球最远飞行距离23.4米2019/12/623二、类和对象•在面向对象程序设计中,程序员可以创建任何新的类型,这些类型可以描述每个对象包含的数据和特征,这种类型称为类。•类是一些对象的抽象,隐藏了对象内部复杂的结构和实现。•类由变量和函数两部分构成,类中的变量称为成员变量,类中的函数称为成员函数。2019/12/6241、对象的概念•Python支持许多不同类型的数据。例如:•1234—int;3.14159—float;”Hello”—str•[1,2,3,5,7,11,13]—list•{”CA”:”California”,”MA”:”Massachusetts”}—dict•以上每种类型都是对象。2019/12/625对象具有的特点:•类型(一个特定的对象被认为是类型的实例)•内部数据表示(简单或复合)•一组与对象交互的方法(函数)2019/12/626•说明:对象的内部表示是私有的,用户不应当依赖其实现的特定细节。如果直接操作对象的内部表示,可能会损害对象的正确行为。例如:[1,2,3,4]•Type:list•内部数据表示:–一个大小为S(=L)的对象数组,或–一组独立单元的链接表data,pointertonextcell•操作列表的方法:–l[i],l[i:j],l[i,j,k],+,*–len(),min(),max(),dell[i]–l.append(…),l.extend(…),l.count(…),l.index(…),l.insert(…),l.pop(…),l.remove(…),l.reverse(…),l.sort(…)2019/12/6272、类和对象的区别•类和对象是OOP中两个重要概念。类是对客观世界中事物的抽象,而对象是类实例化后的实体。•类型和变量之间存在着一定的联系,类型是模板,而变量则是具有这种模板的一个实体。同样,有了“类”类型就有其对应的变量实体,这就是对象。•表面上看对象是某个“类”类型的变量,但对象又不是普通的变量,对象是一个数据和操作的封装体。封装的目的就是阻止非法的访问,因此对象实现了信息的隐藏,外部只能通过操作接口访问对象数据。对象是属于某个已知的类的,因此必须先定义类,然后才能定义对象。2019/12/6282019/12/629•从本质上说,对象是一组数据以及操作这些数据的函数。之前介绍的数字、字符串、列表、字典、集合和函数都是Python提供的内置对象。•要创建新型对象,必须先创建类。类就类似于内置数据类型,可用于创建特定类型的对象。•类指定了对象将包含哪些数据和函数,还指定了对象与其他类的关系。对象封装了数据以及操作这些数据的函数。•一个重要的OOP功能是继承:创建新类时,可让其继承父类的数据和函数。使用好继承可避免重新编写代码,还可让程序更容易理解。类与对象的关系2019/12/630例如:自行车类•数据抽象—型号,品牌,换档数•代码抽象—Break(),SpeedUp(),ChangShift(),Run(),Stop()2019/12/631例如:图形界面•相同点:–有名字–有矩形框–鼠标点击时有效果•不同点:–功能不同2019/12/6323、类的定义•Python使用class关键字定义一个类,类名首字符一般要大写。•当需要创建的类型不能用简单类型来表示时,则需要定义类,然后利用定义的类创建对象。•格式:classClass_name:…2019/12/633例8-3:创建一个Person类2019/12/634说明:•当定义一个类时,如果这个类没有任何父类,则将object设置为它的父类,用这种方式定义的类属于新式类。如果定义的类没有设置任何父类,则这种方式定义的类属于经典类。建议使用新式类,新式类将类与内建类型进行了统一。新式类与经典类在多重继承问题中有一个重要的区别:对于经典类,继承顺序是采用深度优先的搜索算法,对于新式类,继承顺序是采用广度优先的搜索算法。•self是指向对象本身的变量,类似于C++的指针。Python要求,类内定义的每个方法的第一个参数是self,通过实例调用时,该方法才会绑定到该实例上。2019/12/6354、对象的创建•创建对象的过程称为实例化。当一个对象被创建之后,包含3方面的特性:对象的标识、属性和方法。•对象的标识用于区分不同的对象,当对象被创建之后,该对象会获取一块存储空间,存储空间的地址即为对象的标识。对象的属性和方法与类的成员变量和成员函数相对应。2019/12/636例8-4:对象的创建和应用2019/12/637self示意图:2019/12/638•Python自动给每个对象添加特殊变量self,该变量指向对象本身,让类中的函数能够明确地引用对象的数据和函数。5、对象的显示•在例8-4中,定义了一个方法display,用于显示对象的值。•Python还提供了一些特殊方法,能够定制对象的打印。如:–特殊方法__str__,用于生成对象的字符串表示(适合于人阅读的形式);–特殊方法__repr__,返回对象的“官方”表示(适合于解释器读取的形式);此外,可以通过eval()函数重新生成对象。•在大多数类中,方法__repr__都与__str__相同。2019/12/639例如:2019/12/640例8-5:对象的显示2019/12/641执行结果:课堂练习一:•课堂练习一2019/12/642三、属性和方法•类是由属性和方法组成。类的属性是对数据的封装,而类的方法则表示对象具有的行为。•类通常由函数(实例方法)和变量(类变量)组成。•Python的构造函数、析构函数、私有属性或方法都是通过名称约定区分的。•此外,Python还提供了一些有用的内置方法,简化了类的实现。2019/12/643例如:按

1 / 114
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功