版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象思想和编程1222回顾程序包括数据数据类型,数据结构处理过程算法两种程序设计思想面向过程:以操作为中心面向对象:以数据为中心2333数据与操作:面向过程观点程序就是对数据进行一系列的操作先表示数据:常量,变量再来处理数据x = 1y = 2z = x + yprint z 特点:数据与操作分离数据是被动的,操作是主动的344以过程为中心准备好数据之后,主要是进行数据处理过程的设计,即算法设计. 这种设计方法中,数据通常对整个处理过程都是公开的,不能隐藏数据.x = 1y = 2z = x + yw = x y # 和上一行处理同样的数据x,yz = z * w print z455复杂
2、处理过程的设计模块化def op1(a,b): return a * a - b * bdef op2(a,b): return a * b + b * ax = 1y = 2z = 3result1 = op1(x,y)result2 = op2(x,z)print result1 + result2 函数可以看作是更高抽象级的操作,与普通操作似乎并无本质差别.x = 1y = 2res = x + yprint res但函数有数据隐藏功能566函数与数据隐藏函数是功能黑箱使用者需要的只是函数的功能,并不需要知晓它内部是如何实现功能的函数内部处理的数据不对函数外部开放一个函数不能直接访问另一
3、个函数内部的数据677小结:面向过程设计数据与操作分离,以操作过程为中心先表示数据主要精力放在设计数据操作及其流程控制对复杂程序采用自顶向下设计和模块化设计将使用低级别操作的复杂过程设计成使用高级别操作的简单过程 不适合的应用:如GUI程序没有明确的执行流程,由不可预知的事件驱动处理过程788数据与操作:面向对象观点数据与操作不可分离数据类型概念已经提示我们:特定数据值和特定操作是不可分割的两件事情Q:请问x+y是什么意思?A:+对不同类型的x,y值有不同意义.既然如此,何不将特定数据值与特定操作捆绑在一起,形成一种新型数据?由此产生了对象概念899对象对象(Object):集数据与操作于一身
4、.对象拥有特定数据对象能对其数据进行特定操作计算:向对象发操作请求消息.对象是主动的,自己掌控对其数据的操作对象将自己能执行的操作对外公开面向对象(Object-Oriented):软件系统由各种对象组成,对象之间通过消息进行交互.91010对象例子人数据:姓名,出生日期,身高,体重,.操作:计算年龄,判断体重是否标准,.电视机数据:型号,厂商,尺寸,频道数,.操作:开机,关机,调频道,调音量,.室内环境数据:温度,湿度,容积,.操作:调节温度,调节湿度,换算容积单位101111面向过程vs面向对象编程假设一个问题涉及数据X和Y,对X要进行的操作为f(),g(),对Y的操作为h()面向过程设计
5、和面向对象得到的程序分别形如X = .Y = .f(X)g(X)h(Y)Xf()g()Yh()请求X执行f()请求X执行g()请求Y执行h()11121212复杂数据的表示简单数据可以用现成的数据类型表示每个数据类型都包括定义一个值的集合:如int定义一些对值的运算(操作):如+,-,*,/复杂数据如何表示?拆成简单数据例如学生拆成name,age,addr等简单数据定义新类型例如定义类型S,其值是由name,age,addr等构成的整体12131313自定义类型的值和操作分离融为一体13141414从类型到类类是类型概念的发展对象是广义的数据值对象所属的数据类型就是类用于描述复杂数据的静态和
6、动态行为类(class):描述相似对象的共性.包括数据操作:方法(method)对象是类的实例14151515类与抽象类是对现实事物的抽象数据抽象例如:从具体学生抽象出姓名,年龄,地址等数据行为抽象例如:从学生日常行为抽象出选课,加入社团等操作于是产生了类Student的定义抽象可以在多个层次上进行例如:学生-人-动物-生物15161616封装封装:数据和操作结合成一个程序单元,对外部隐藏内部实现细节.不允许用户直接操作类中被隐藏的信息 用户也无需了解隐藏的信息就能使用该类类对外公开方法名称和调用格式,即界面.外界向对象发消息(方法名及参数)对象响应消息,执行相应方法外界只能按对象允许的方式来
7、处理对象数据16171717封装的好处安全:对象自己的方法处理自己的数据易用:使用者无需了解内部实现细节易维护:实现者修改内部实现不会影响使用者标准化:同类甚至不同类的对象对使用者都呈现同样的操作界面17类的定义类定义class : 方法定义同函数定义def (): .方法是依附于类的函数,普通函数则是独立的.方法的第一个参数是专用的,习惯用名字self.具体含义见后.只能通过向对象发消息来调用方法.1818实例变量(1)回忆:对象是数据和操作的结合.类定义中,方法对应于操作.数据呢?对象的数据以实例变量形式定义.实例变量self.在方法中定义self. = 主要出现在_init_()方法中1
8、919实例变量(2)每个类实例(对象)具有自己的实例变量副本,用来存储该对象自己的数据.对实例变量的访问:.实例变量与函数局部变量不同!同一个类的各个方法都可以访问实例变量.类的方法中也可以定义局部变量,不能被其他方法访问.2020212121例:类定义类Person(可单独保存为模块person.py)class Person: def _init_(self,n,y): = n self.year = y def whatName(self): print My name is, def howOld(self,y): age = y self.yea
9、r if age 0: print My age in,y,is,age else: print I was born in,self.year 21实例创建(1)类与实例:抽象与具体.人是类,张三是人的实例一个类可以创建任意多个实例各实例具有相同的行为:由方法决定但具有不同的数据:由实例变量决定实例创建 = ()这里相当于一个函数,称为构造器,用来构造实例.2222实例创建(2)创建时对实例进行初始化用构造器创建实例时,系统会自动调用_init_方法通常在此方法中执行一些初始化操作_init_所需的参数由构造器提供.例如: from person import Person p1 = Per
10、son(Lucy,2005) 2323例:实例创建(1)创建一个Person实例 from person import Person p1 = Person(Lucy,2005) 2424例:实例创建(2)创建两个Person实例 from person import Person p1 = Person(Lucy,2005) p2 = Person(Tom,1990) 2525方法调用类似函数调用,但需指明实例(对象).()就是与形参self对应的实参.例如 p1.whatName()My name is Lucy p2.whatName()My name is Tom p2.howOld(
11、2013)My age in 2013 is 23 2626方法调用图示 p1.whatName() p2.howOld(2013)2727编程案例:模拟炮弹飞行(1)程序规格输入:炮弹的发射角度,初速和高度输出:炮弹的射程解决方法:模拟炮弹飞行过程,即计算每一时刻炮弹的位置.连续运动的离散化时间:t, t+t, t+2t, t+3t, .轨迹: (xt,yt), (xt+t,yt+t), .2828编程案例:模拟炮弹飞行(2)算法:输入角度angle(度),初速v(米/秒),高度h0(米),间隔t(秒)将angle换算成弧度单位的thetaxv = v * cos(theta)yv = v
12、* sin(theta)初始位置(xpos,ypos) = (0,h0)当炮弹还未落地(即ypos = 0.0):更新炮弹位置(xpos,ypos)更新yv 输出xpos 2929编程案例:模拟炮弹飞行(3)核心代码:位置更新水平方向xpos = xpos + xv * t垂直方向yv1 = yv - 9.8 * typos = ypos + (yv + yv1) / 2.0 * t完整程序cball1.py这个版本是流水帐式的,没有章法结构.程序不长,倒有10个变量,为理解程序需要跟踪这10个数据的变化.3030编程案例:模拟炮弹飞行(4)模块化版本cball2.py主程序(主函数)非常简洁
13、,易理解.def main():angle, v, h0, t = getInputs()xv, yv = getXY(v,angle)xpos = 0ypos = h0while ypos = 0:xpos,ypos,yv = update(t,xpos,ypos,xv,yv)print 射程: %0.1f 米. % (xpos)将辅助性变量(theta和yv1)隐藏在辅助函数中.仍然不够好:update函数界面太复杂.3131编程案例:模拟炮弹飞行(5)面向对象版本cball3.py炮弹是现实实体,用xpos,ypos,xv和yv四个分离的数据来描述它是“只见树木不见森林”.OOP:将炮弹
14、的信息和行为都封装在类中,并创建一个炮弹对象,程序会更加简洁易理解.def main(): angle, vel, h0, time = getInputs() cball = Projectile(angle, vel, h0) while cball.getY() = 0: cball.update(time) print 射程: %0.1f 米. % (cball.getX()所有复杂性都隐藏在类中了3232编程案例:模拟炮弹飞行(6)三个版本体现的思想变迁3333类与模块化复杂程序的模块化设计功能分解:利用子程序(如函数)概念,以过程为中心设计功能模块数据分解:利用类的概念,以数据为中心设计数据模块功能模块不太适合复杂数据的处理类模块独立性更高,可重用性更好类定义可以提供给任何程序使用很多OO语言都提供类库3434例:学生信息处理系统功能分解课程注册模块,修改学生信息模块,成绩登录模块等每个模块(函数)都需要了解”学生”数据的细节数据分解创建”学生”类S,隐藏数据和操作实现细节,使用者无需了解内部细节就能执行操作其他数据模块包括”课程”类,”教师”类等3535如何表示任意复
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度GRC构件安装与装配式建筑推广合作合同2篇
- 2025版城市照明工程个人承包施工合同范本
- 2024年食品饮料行业原材料统一采购合同3篇
- 二零二五年出租车企业车辆安全操作规程合同3篇
- 2024版专业退汇协议格式立即下载版B版
- 2025版湖北租赁合同解除及终止合同范本3篇
- 2024材料供货的合同范本
- 2025版购房合同范本包含房产产权登记及产权证书遗失补发流程3篇
- 2025年度cro项目研发进度调整合同3篇
- 二零二五年冷链物流配送合同(生鲜电商)3篇
- 老化测试记录表
- 金属齿形垫片安全操作规定
- (完整版)ABAQUS有限元分析实例详解
- 区块链技术与应用学习通课后章节答案期末考试题库2023年
- 2023学年度广东省广州市天河区九年级(上)期末化学试卷(附详解)
- 拍卖行业务管理制度拍卖行管理制度
- 焊接工序首件检验记录表
- 七年级上学期期末考试历史试卷及答案(人教版)
- 饮品创业项目计划书
- 外国文学史期末考试题库(含答案)
- GB 18384-2020电动汽车安全要求
评论
0/150
提交评论