资源预览内容
第1页 / 共39页
第2页 / 共39页
第3页 / 共39页
第4页 / 共39页
第5页 / 共39页
第6页 / 共39页
第7页 / 共39页
第8页 / 共39页
第9页 / 共39页
第10页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
面向对象思想和编程面向对象思想和编程2 2 2回顾回顾程序包括程序包括数据数据数据类型数据类型,数据结构数据结构处理过程处理过程算法算法两种程序设计思想两种程序设计思想面向过程面向过程:以操作为中心以操作为中心面向对象面向对象:以数据为中心以数据为中心3 3 3数据与操作数据与操作:面向过程观点面向过程观点程序就是对数据进行一系列的操作程序就是对数据进行一系列的操作先表示数据先表示数据:常量常量,变量变量再来处理数据再来处理数据x=1y=2z=x+yprintz 特点特点:数据与操作分离数据与操作分离数据是被动的数据是被动的,操作是主动的操作是主动的4 4以过程为中心以过程为中心准备好数据之后准备好数据之后,主要是进行数据处理过主要是进行数据处理过程的设计程的设计,即算法设计即算法设计. 这种设计方法中这种设计方法中,数据通常对整个处理过数据通常对整个处理过程都是公开的程都是公开的,不能隐藏数据不能隐藏数据.x=1y=2z=x+yw=xy#和上一行处理同样的数据和上一行处理同样的数据x,yz=z*wprintz5 5复杂处理过程的设计复杂处理过程的设计模块化模块化defop1(a,b):returna*a-b*bdefop2(a,b):returna*b+b*ax=1y=2z=3result1=op1(x,y)result2=op2(x,z)printresult1+result2 函数函数可以看作是更高可以看作是更高抽象级的操作抽象级的操作,与普通与普通操作似乎并无本质差别操作似乎并无本质差别.x=1y=2res=x+yprintres但函数有数据隐藏功能但函数有数据隐藏功能6 6函数与数据隐藏函数与数据隐藏函数是功能黑箱函数是功能黑箱使用者需要的只是函数的功能使用者需要的只是函数的功能,并不需要知并不需要知晓它内部是如何实现功能的晓它内部是如何实现功能的函数内部处理的数据不对函数外部开放函数内部处理的数据不对函数外部开放一个函数不能直接访问另一个函数内部的数据一个函数不能直接访问另一个函数内部的数据7 7小结小结:面向过程设计面向过程设计数据与操作分离数据与操作分离,以操作过程为中心以操作过程为中心先表示数据先表示数据主要精力放在设计数据操作及其流程控制主要精力放在设计数据操作及其流程控制对复杂程序采用自顶向下设计和模块化设计对复杂程序采用自顶向下设计和模块化设计将使用低级别操作的复杂过程设计成使用高级别将使用低级别操作的复杂过程设计成使用高级别操作的简单过程操作的简单过程 不适合的应用不适合的应用:如如GUI程序程序没有明确的执行流程没有明确的执行流程,由不可预知的事件驱由不可预知的事件驱动处理过程动处理过程8 8数据与操作数据与操作:面向对象观点面向对象观点数据与操作不可分离数据与操作不可分离数据类型概念已经提示我们数据类型概念已经提示我们:特定数据值和特定数据值和特定操作是不可分割的两件事情特定操作是不可分割的两件事情Q:请问请问x+y是什么意思是什么意思?A:+对不同类型的对不同类型的x,y值有不同意义值有不同意义.既然如此既然如此,何不将特定数据值何不将特定数据值与特定操作捆绑在一起与特定操作捆绑在一起,形成一形成一种新型种新型数据数据?由此产生了对象概念由此产生了对象概念9 9对象对象对象对象(Object):集数据与操作于一身集数据与操作于一身.对象拥有特定数据对象拥有特定数据对象能对其数据进行特定操作对象能对其数据进行特定操作计算计算:向对象发操作请求消息向对象发操作请求消息.对象是主动的对象是主动的,自己掌控对其数据的操作自己掌控对其数据的操作对象将自己能执行的操作对外公开对象将自己能执行的操作对外公开面向对象面向对象(Object-Oriented):软件系统由各软件系统由各种对象组成种对象组成,对象之间通过消息进行交互对象之间通过消息进行交互.1010对象例子对象例子人人数据数据:姓名姓名,出生日期出生日期,身高身高,体重体重,.操作操作:计算年龄计算年龄,判断体重是否标准判断体重是否标准,.电视机电视机数据数据:型号型号,厂商厂商,尺寸尺寸,频道数频道数,.操作操作:开机开机,关机关机,调频道调频道,调音量调音量,.室内环境室内环境数据数据:温度温度,湿度湿度,容积容积,.操作操作:调节温度调节温度,调节湿度调节湿度,换算容积换算容积单位单位1111面向过程面向过程vs面向对象编程面向对象编程假设一个问题涉及数据假设一个问题涉及数据X和和Y,对对X要进行要进行的操作为的操作为f(),g(),对对Y的操作为的操作为h()面向过程设计和面向对象得到的程序分别形面向过程设计和面向对象得到的程序分别形如如X = .Y = .f(X)g(X)h(Y)Xf()g()Yh()请求X执行f()请求X执行g()请求Y执行h()121212复杂数据的表示复杂数据的表示简单数据可以用现成的数据类型表示简单数据可以用现成的数据类型表示每个数据类型都包括每个数据类型都包括定义一个值的集合定义一个值的集合:如如int定义一些对值的运算定义一些对值的运算(操作操作):如如+,-,*,/复杂数据如何表示复杂数据如何表示?拆成简单数据拆成简单数据例如例如学生学生拆成拆成name,age,addr等简单数据等简单数据定义新类型定义新类型例如定义类型例如定义类型S,其值是由其值是由name,age,addr等构成等构成的整体的整体131313自定义类型的值和操作自定义类型的值和操作分离分离融为一体融为一体141414从类型到类从类型到类类是类型概念的发展类是类型概念的发展对象是广义的对象是广义的数据值数据值对象所属的数据类型就是对象所属的数据类型就是类类用于描述复杂数据的静态和动态行为用于描述复杂数据的静态和动态行为类类(class):描述相似对象的共性描述相似对象的共性.包括包括数据数据操作操作:方法方法(method)对象是类的对象是类的实例实例151515类与抽象类与抽象类是对现实事物的抽象类是对现实事物的抽象数据抽象数据抽象例如例如:从具体学生抽象出姓名从具体学生抽象出姓名,年龄年龄,地址等数据地址等数据行为抽象行为抽象例如例如:从学生日常行为抽象出选课从学生日常行为抽象出选课,加入社团等操加入社团等操作作于是产生了类于是产生了类Student的定义的定义抽象可以在多个层次上进行抽象可以在多个层次上进行例如例如:学生学生-人人-动物动物-生物生物161616封装封装封装封装:数据和操作结合成一个程序单元数据和操作结合成一个程序单元,对对外部隐藏内部实现细节外部隐藏内部实现细节.不允许用户直接操作类中被隐藏的信息不允许用户直接操作类中被隐藏的信息 用户也无需了解隐藏的信息就能使用该类用户也无需了解隐藏的信息就能使用该类类对外公开方法名称和调用格式类对外公开方法名称和调用格式,即界面即界面.外界向对象发消息外界向对象发消息(方法名及参数方法名及参数)对象响应消息对象响应消息,执行相应方法执行相应方法外界只能按对象允许的方式来处理对象数据外界只能按对象允许的方式来处理对象数据171717封装的好处封装的好处安全安全:对象自己的方法处理自己的数据对象自己的方法处理自己的数据易用易用:使用者无需了解内部实现细节使用者无需了解内部实现细节易维护易维护:实现者修改内部实现不会影响使实现者修改内部实现不会影响使用者用者标准化标准化:同类甚至不同类的对象对使用者同类甚至不同类的对象对使用者都呈现同样的操作界面都呈现同样的操作界面类的定义类的定义类定义类定义class : 方法定义同函数定义方法定义同函数定义def():.方法是依附于类的函数方法是依附于类的函数,普通函数则是独立的普通函数则是独立的.方法的第一个参数是专用的方法的第一个参数是专用的,习惯用名字习惯用名字self.具体含义见后具体含义见后.只能通过向对象发消息来调用方法只能通过向对象发消息来调用方法.18实例变量实例变量(1)回忆回忆:对象是数据和操作的结合对象是数据和操作的结合.类定义中类定义中,方法对应于操作方法对应于操作.数据呢数据呢?对象的数据以实例变量形式定义对象的数据以实例变量形式定义.实例变量实例变量self.在方法中定义在方法中定义self. = 主要出现在主要出现在_init_()方法中方法中19实例变量实例变量(2)每个类实例每个类实例(对象对象)具有自己的实例变量具有自己的实例变量副本副本,用来存储该对象自己的数据用来存储该对象自己的数据.对实例变量的访问对实例变量的访问:.实例变量与函数局部变量不同实例变量与函数局部变量不同!同一个类的各个方法都可以访问实例变量同一个类的各个方法都可以访问实例变量.类的方法中也可以定义局部变量类的方法中也可以定义局部变量,不能被其他不能被其他方法访问方法访问.20212121例例:类定义类定义类类Person(可单独保存为模块可单独保存为模块person.py)classPerson:def_init_(self,n,y):self.name=nself.year=ydefwhatName(self):printMynameis,self.namedefhowOld(self,y):age=yself.yearifage0:printMyagein,y,is,ageelse:printIwasbornin,self.year 实例创建实例创建(1)类与实例类与实例:抽象与具体抽象与具体.人人是类是类,张三张三是人的实例是人的实例一个类可以创建任意多个实例一个类可以创建任意多个实例各实例具有相同的行为各实例具有相同的行为:由方法决定由方法决定但具有不同的数据但具有不同的数据:由实例变量决定由实例变量决定实例创建实例创建 = ()这里这里相当于一个函数相当于一个函数,称为构造器称为构造器,用用来构造实例来构造实例.22实例创建实例创建(2)创建时对实例进行初始化创建时对实例进行初始化用构造器创建实例时用构造器创建实例时,系统会自动调用系统会自动调用_init_方法方法通常在此方法中执行一些初始化操作通常在此方法中执行一些初始化操作_init_所需的参数由构造器提供所需的参数由构造器提供.例如例如:frompersonimportPersonp1=Person(Lucy,2005) 23例例:实例创建实例创建(1)创建一个创建一个Person实例实例frompersonimportPersonp1=Person(Lucy,2005) 24例例:实例创建实例创建(2)创建两个创建两个Person实例实例frompersonimportPersonp1=Person(Lucy,2005)p2=Person(Tom,1990) 25方法调用方法调用类似函数调用类似函数调用,但需指明实例但需指明实例(对象对象).()就是与形参就是与形参self对应的实参对应的实参.例如例如p1.whatName()MynameisLucyp2.whatName()MynameisTomp2.howOld(2013)Myagein2013is23 26方法调用图示方法调用图示p1.whatName()p2.howOld(2013)27编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(1)程序规格程序规格输入输入:炮弹的发射角度炮弹的发射角度,初速和高度初速和高度输出输出:炮弹的射程炮弹的射程解决方法解决方法:模拟炮弹飞行过程模拟炮弹飞行过程,即计算每即计算每一时刻炮弹的位置一时刻炮弹的位置.连续运动的离散化连续运动的离散化时间时间:t, t+ t, t+2 t, t+3 t, .轨迹轨迹: (xt,yt), (xt+ t,yt+ t), .28编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(2)算法算法:输输入入角角度度angle(度度),初初速速v(米米/秒秒),高高度度h0(米米),间间隔隔t(秒秒)将将angle换算成弧度单位的换算成弧度单位的thetaxv=v*cos(theta)yv=v*sin(theta)初始位置初始位置(xpos,ypos)=(0,h0)当炮弹还未落地当炮弹还未落地(即即ypos=0.0):更新炮弹位置更新炮弹位置(xpos,ypos)更新更新yv输出输出xpos29编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(3)核心代码核心代码:位置更新位置更新水平方向水平方向xpos=xpos+xv*t垂直方向垂直方向yv1=yv-9.8*typos=ypos+(yv+yv1)/2.0*t完整程序完整程序cball1.py这个版本是这个版本是流水帐式的流水帐式的,没有没有章法结构章法结构.程序不长程序不长,倒有倒有10个变量个变量,为理解程序需要跟踪这为理解程序需要跟踪这10个数据的变化个数据的变化.30编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(4)模块化版本模块化版本cball2.py主程序主程序(主函数主函数)非常简洁非常简洁,易理解易理解.defmain():angle,v,h0,t=getInputs()xv,yv=getXY(v,angle)xpos=0ypos=h0whileypos=0:xpos,ypos,yv=update(t,xpos,ypos,xv,yv)print射程射程:%0.1f米米.%(xpos)将辅助性变量将辅助性变量(theta和和yv1)隐藏在辅助函数中隐藏在辅助函数中.仍然不够好仍然不够好:update函数界面太复杂函数界面太复杂.31编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(5)面向对象版本面向对象版本cball3.py炮弹是现实实体炮弹是现实实体, ,用用xpos,ypos,xv和和yv四个分离的数四个分离的数据来描述它是据来描述它是“只见树木不见森林只见树木不见森林”. .OOP:将炮弹的信息和行为都封装在类中将炮弹的信息和行为都封装在类中,并创建一并创建一个炮弹对象个炮弹对象,程序会更加简洁易理解程序会更加简洁易理解.defmain():angle,vel,h0,time=getInputs()cball=Projectile(angle,vel,h0)whilecball.getY()=0:cball.update(time)print射程射程:%0.1f米米.%(cball.getX()所有复杂性都隐藏在类中了所有复杂性都隐藏在类中了32编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(6)三个版本体现的思想变迁三个版本体现的思想变迁33类与模块化类与模块化复杂程序的模块化设计复杂程序的模块化设计功能分解功能分解:利用子程序利用子程序(如函数如函数)概念概念,以过程为以过程为中心设计功能模块中心设计功能模块数据分解数据分解:利用类的概念利用类的概念,以数据为中心设计以数据为中心设计数据模块数据模块功能模块不太适合复杂数据的处理功能模块不太适合复杂数据的处理类模块独立性更高类模块独立性更高,可重用性更好可重用性更好类定义可以提供给任何程序使用类定义可以提供给任何程序使用很多很多OO语言都提供类库语言都提供类库34例例:学生信息处理系统学生信息处理系统功能分解功能分解课程注册模块课程注册模块,修改学生信息模块修改学生信息模块,成绩登录成绩登录模块等模块等每个模块每个模块(函数函数)都需要了解都需要了解”学生学生”数据的细数据的细节节数据分解数据分解创建创建”学生学生”类类S,隐藏数据和操作实现细节隐藏数据和操作实现细节,使使用者无需了解内部细节就能执行操作用者无需了解内部细节就能执行操作其他数据模块包括其他数据模块包括”课程课程”类类,”教师教师”类等类等35如何表示任意复杂的数据如何表示任意复杂的数据数据的复杂性表现在数据的复杂性表现在数量大数量大:用集合体数据类型来表示用集合体数据类型来表示有内部深层结构有内部深层结构:用类来表示用类来表示两种复杂性混合两种复杂性混合:用用对象的集合对象的集合来刻画来刻画people=p1,p2forpinpeople:p.whatName()p.howOld(2013) 36373737超类与子类超类与子类*子类子类继承继承覆写覆写多态多态383838面向对象设计面向对象设计*OOD:对给定问题找出并定义一组有用的对给定问题找出并定义一组有用的类的过程类的过程.基于词性分析的一种方法基于词性分析的一种方法问题描述问题描述描述中的名词描述中的名词(事物事物)问题描述中的动词问题描述中的动词(对象行为对象行为)3939End
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号