《面向对象思想和编程》由会员分享,可在线阅读,更多相关《面向对象思想和编程(39页珍藏版)》请在金锄头文库上搜索。
1、面向对象思想和编程面向对象思想和编程沮虞珐疯菏疏爷厢妮毗族窖果蝉菇忠袄踊疙笔屑弥唤治敖诗脚回宦蓝被柠面向对象思想和编程绪论2 2 2回顾回顾程序包括程序包括数据数据数据数据类型型,数据数据结构构处理理过程程算法算法两种程序设计思想两种程序设计思想面向面向过程程:以操作以操作为中心中心面向面向对象象:以数据以数据为中心中心卯窝貉冕谦枫昏各罢御神粉被嘴款姥弦朝粕肝腰亩纷家迪竿恐价脂漫能婚面向对象思想和编程绪论3 3 3数据与操作数据与操作:面向过程观点面向过程观点程序就是对数据进行一系列的操作程序就是对数据进行一系列的操作先表示数据先表示数据:常量常量,变量量再来再来处理数据理数据x=1y=2z=
2、x+yprintz 特点特点:数据与操作分离数据与操作分离数据是被数据是被动的的,操作是主操作是主动的的锑甄失局酒脆晋撂滞迢萨创柑飞值殖随难手咬递逮凛虎恕饱漳蛾其糯御拳面向对象思想和编程绪论4 4以过程为中心以过程为中心准备好数据之后准备好数据之后,主要是进行数据处理过主要是进行数据处理过程的设计程的设计,即算法设计即算法设计. 这种设计方法中这种设计方法中,数据通常对整个处理过数据通常对整个处理过程都是公开的程都是公开的,不能隐藏数据不能隐藏数据.x=1y=2z=x+yw=xy#和上一行和上一行处理同理同样的数据的数据x,yz=z*wprintz流鬃瘤衅容消鞋巫繁望拂航歧柱鞭凡炳埔枢顷杠粱却
3、灼怔颁皋昭舍贬振钧面向对象思想和编程绪论5 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但函数有数据隐藏功能但函数有数据隐藏功能仑枕品匝曲握谬寺斡专商茁播狱甚蚜和癣喊毅毙倒幽边纵郧一浸日窝菌俞面向对象思想和编程绪
4、论6 6函数与数据隐藏函数与数据隐藏函数是功能黑箱函数是功能黑箱使用者需要的只是函数的功能使用者需要的只是函数的功能,并不需要知并不需要知晓它内部是如何它内部是如何实现功能的功能的函数内部函数内部处理的数据不理的数据不对函数外部开放函数外部开放一个函数不能直接一个函数不能直接访问另一个函数内部的数据另一个函数内部的数据辞虎夺迟嘶杯戒绵按佐灼谬殿夸懒鲸仁滴尝慕墙妥钩术波卯柱酸跃依幻咐面向对象思想和编程绪论7 7小结小结:面向过程设计面向过程设计数据与操作分离数据与操作分离,以操作过程为中心以操作过程为中心先表示数据先表示数据主要精力放在主要精力放在设计数据操作及其流程控制数据操作及其流程控制对复
5、复杂程序采用自程序采用自顶向下向下设计和模和模块化化设计将使用低将使用低级别操作的复操作的复杂过程程设计成使用高成使用高级别操作的操作的简单过程程 不适合的应用不适合的应用:如如GUI程序程序没有明确的没有明确的执行流程行流程,由不可由不可预知的事件知的事件驱动处理理过程程拯聂掐取提结琐旺断煽掖脆退畦蛋岸雌珊岁建挛粱娶注砌冯腕缅茵但琉矣面向对象思想和编程绪论8 8数据与操作数据与操作:面向对象观点面向对象观点数据与操作不可分离数据与操作不可分离数据数据类型概念已型概念已经提示我提示我们:特定数据特定数据值和和特定操作是不可分割的两件事情特定操作是不可分割的两件事情Q:请问x+y是什么意思是什么
6、意思?A:+对不同不同类型的型的x,y值有不同意有不同意义.既然如此既然如此,何不将特定数据值何不将特定数据值与特定操作捆绑在一起与特定操作捆绑在一起,形成一形成一种新型种新型数据数据?由此由此产生了生了对象概念象概念尸萍何耗吨颐晤插略贩状枚征里傻受弱任零惟呻劝矮郑吻鼠邵潘攘玖采旺面向对象思想和编程绪论9 9对象对象对象对象(Object):集数据与操作于一身集数据与操作于一身.对象象拥有特定数据有特定数据对象能象能对其数据其数据进行特定操作行特定操作计算计算:向对象发操作请求消息向对象发操作请求消息.对象是主象是主动的的,自己掌控自己掌控对其数据的操作其数据的操作对象将自己能象将自己能执行的
7、操作行的操作对外公开外公开面向对象面向对象(Object-Oriented):软件系统由软件系统由各种对象组成各种对象组成,对象之间通过消息进行交对象之间通过消息进行交互互.缘万肛荤汐浅壤疙帜卜崎座警要角按策轨京胁傣秤绷壹翟酷拘喇圭魔统颗面向对象思想和编程绪论1010对象例子对象例子人人数据数据:姓名姓名,出生日期出生日期,身高身高,体重体重,.操作操作:计算年算年龄,判断体重是否判断体重是否标准准,.电视机电视机数据数据:型号型号,厂商厂商,尺寸尺寸,频道数道数,.操作操作:开机开机,关机关机,调频道道,调音量音量,.室内环境室内环境数据数据:温度温度,湿度湿度,容容积,.操作操作:调节温度
8、温度,调节湿度湿度,换算容算容积单位位衬爹城买启摧怂症贾朱翱艺韩瀑擎瞒尼赁个稿逞赐胯陵舷伟关鹃抛它疡伙面向对象思想和编程绪论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复杂数据的表示
9、复杂数据的表示简单数据可以用现成的数据类型表示简单数据可以用现成的数据类型表示每个数据类型都包括每个数据类型都包括定定义一个一个值的集合的集合:如如int定定义一些一些对值的运算的运算(操作操作):如如+,-,*,/复杂数据如何表示复杂数据如何表示?拆成拆成简单数据数据例如例如学生学生拆成拆成name,age,addr等等简单数据数据定定义新新类型型例如定例如定义类型型S,其其值是由是由name,age,addr等构成等构成的整体的整体鞠击舰叶翱扣免蔡袋功燥筏留仕问加篙赡禽心缉变卸身刀复元寡挤盟酒轮面向对象思想和编程绪论131313自定义类型的值和操作自定义类型的值和操作分离分离融为一体融为一
10、体榜礼册姨恶皖贤复癸家釜全阔擦堵镑韧铁须嗡捐宝酒惋昂敢锄仅辜龙纫混面向对象思想和编程绪论141414从类型到类从类型到类类是类型概念的发展类是类型概念的发展对象是广象是广义的的数据数据值对象所属的数据象所属的数据类型就是型就是类用于描述复用于描述复杂数据的静数据的静态和和动态行行为类类(class):描述相似对象的共性描述相似对象的共性.包括包括数据数据操作操作:方法方法(method)对象是类的对象是类的实例实例秧缚魏渴瞅短苍停慷减敌堰挫桃倦杨路乖菲茬娱恋萧砚徘婆钙世滓耕乞郴面向对象思想和编程绪论151515类与抽象类与抽象类是对现实事物的抽象类是对现实事物的抽象数据抽象数据抽象例如例如:从
11、具体学生抽象出姓名从具体学生抽象出姓名,年年龄,地址等数据地址等数据行行为抽象抽象例如例如:从学生日常行从学生日常行为抽象出抽象出选课,加入社加入社团等操等操作作于是于是产生了生了类Student的定的定义抽象可以在多个层次上进行抽象可以在多个层次上进行例如例如:学生学生-人人-动物物-生物生物绷钻汲妖吨蹦槽佣帧做顾颧囚栖藩发睡肥樱苛谱篙竞郝庶霸蝇藏枉股纱夕面向对象思想和编程绪论161616封装封装封装封装:数据和操作结合成一个程序单元数据和操作结合成一个程序单元,对对外部隐藏内部实现细节外部隐藏内部实现细节.不允不允许用用户直接操作直接操作类中被中被隐藏的信息藏的信息 用用户也无需了解也无需
12、了解隐藏的信息就能使用藏的信息就能使用该类类对外公开方法名称和调用格式类对外公开方法名称和调用格式,即界面即界面.外界向外界向对象象发消息消息(方法名及参数方法名及参数)对象响象响应消息消息,执行相行相应方法方法外界只能按外界只能按对象允象允许的方式来的方式来处理理对象数据象数据劲琐潦进奢枯耕叹却侄齿抵池厅销堂习郝锹苑扫苑颓捐各猩拐皱蝇旭兔掂面向对象思想和编程绪论171717封装的好处封装的好处安全安全:对象自己的方法处理自己的数据对象自己的方法处理自己的数据易用易用:使用者无需了解内部实现细节使用者无需了解内部实现细节易维护易维护:实现者修改内部实现不会影响使实现者修改内部实现不会影响使用者
13、用者标准化标准化:同类甚至不同类的对象对使用者同类甚至不同类的对象对使用者都呈现同样的操作界面都呈现同样的操作界面眨薛肆秃讳洽挑厌根腕祷捶冈锰纽墓崭笺凭丑酚狄柱褒画申裙泡再旬液头面向对象思想和编程绪论类的定义类的定义类定义类定义class : 方法定方法定义同函数定同函数定义def():.方法是依附于方法是依附于类的函数的函数,普通函数普通函数则是独立的是独立的.方法的第一个参数是方法的第一个参数是专用的用的,习惯用名字用名字self.具体含具体含义见后后.只能通只能通过向向对象象发消息来消息来调用方法用方法.18咐惩黔傣因速敦缓畔菲厘舌踢消馒磅絮架矣喇板澡气镁甲让忱形似析蒋六面向对象思想和编
14、程绪论实例变量实例变量(1)回忆回忆:对象是数据和操作的结合对象是数据和操作的结合.类定定义中中,方法方法对应于操作于操作.数据呢数据呢?对象的数据以实例变量形式定义对象的数据以实例变量形式定义.实例例变量量self.在方法中定在方法中定义self. = 主要出主要出现在在_init_()方法中方法中19央细晦傀长酷恤搓吠婶嫁形愁仗舷序稽蚤捣边粉害汁熟积万恼瘸准端跳纲面向对象思想和编程绪论实例变量实例变量(2)每个类实例每个类实例(对象对象)具有自己的实例变量具有自己的实例变量副本副本,用来存储该对象自己的数据用来存储该对象自己的数据.对实例变量的访问对实例变量的访问:.实例变量与函数局部变量
15、不同实例变量与函数局部变量不同!同一个同一个类的各个方法都可以的各个方法都可以访问实例例变量量.类的方法中也可以定的方法中也可以定义局部局部变量量,不能被其不能被其他方法他方法访问.20寡筐卓渗聋题跨霹懂冯矽芥戒项藏指类焉晚喧届琳养蟹隙恢稳鸭忿墓祁茵面向对象思想和编程绪论212121例例:类定义类定义类类Person(可单独保存为模块可单独保存为模块person.py)classPerson:def_init_(self,n,y):self.name=nself.year=ydefwhatName(self):printMynameis,self.namedefhowOld(self,y):a
16、ge=yself.yearifage0:printMyagein,y,is,ageelse:printIwasbornin,self.year 八烩冤噶级满年尤釉别寂命延憨颊姥兆排涩尖傍挂瞩掀惟尽息袍志夷勋辫面向对象思想和编程绪论实例创建实例创建(1)类与实例类与实例:抽象与具体抽象与具体.人人是是类,张三三是人的是人的实例例一个一个类可以可以创建任意多个建任意多个实例例各各实例具有相同的行例具有相同的行为:由方法决定由方法决定但具有不同的数据但具有不同的数据:由由实例例变量决定量决定实例创建实例创建 = ()这里里相当于一个函数相当于一个函数,称称为构造器构造器,用用来构造来构造实例例.22
17、续镑瓜详沽衙迭傍务嫉菲枉摈辆郭阴游踏玉逗钾问繁摸践牲项迫俯泳蔡呕面向对象思想和编程绪论实例创建实例创建(2)创建时对实例进行初始化创建时对实例进行初始化用构造器用构造器创建建实例例时,系系统会自会自动调用用_init_方法方法通常在此方法中通常在此方法中执行一些初始化操作行一些初始化操作_init_所需的参数由构造器提供所需的参数由构造器提供.例如例如:frompersonimportPersonp1=Person(Lucy,2005) 23明棉狐掺衰再燃万潦敖剪处曰央竹葛参趾孙土渔荤渣婿劲役露字腥妄倒燥面向对象思想和编程绪论例例:实例创建实例创建(1)创建一个创建一个Person实例实例fr
18、ompersonimportPersonp1=Person(Lucy,2005) 24学怒教顿踢雷嚷跌明龙自款拿禄虫港惺择肋泅液造衅咨豁牡邀夜虽塞绑狞面向对象思想和编程绪论例例:实例创建实例创建(2)创建两个创建两个Person实例实例frompersonimportPersonp1=Person(Lucy,2005)p2=Person(Tom,1990) 25蚂委禄捻揭充首矮尽昂过像禽垛臂渣往健娠座烩咏耶谦搜恰腋屯蚌祈错箱面向对象思想和编程绪论方法调用方法调用类似函数调用类似函数调用,但需指明实例但需指明实例(对象对象).()就是与形参就是与形参self对应的的实参参.例如例如p1.what
19、Name()MynameisLucyp2.whatName()MynameisTomp2.howOld(2013)Myagein2013is23 26痊皱耿掠阿钟次咨播耙滨诚阁租翰游辕随恶余宝醉怀狙垣围懈虽蓖怕版喉面向对象思想和编程绪论方法调用图示方法调用图示p1.whatName()p2.howOld(2013)27滴鳃懈淮犊名苑浮奈携另蔬蔓提窖式喜剃破踢言酉五须貉言垣靠喧灭咆愚面向对象思想和编程绪论编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(1)程序规格程序规格输入入:炮炮弹的的发射角度射角度,初速和高度初速和高度输出出:炮炮弹的射程的射程解决方法解决方法:模拟炮弹飞行过程模拟炮弹飞行过程
20、,即计算每即计算每一时刻炮弹的位置一时刻炮弹的位置.连续运运动的离散化的离散化时间: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)=(
21、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个个变量量,为理解程序需要跟踪理解
22、程序需要跟踪这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
23、)隐藏在藏在辅助函数中助函数中.仍然不仍然不够好好:update函数界面太复函数界面太复杂.31施甩姑燃寒北坟膀苟沪荡砸凹吝哭冶野文气哈如松辜序瘴梁躇翁繁冰狰咱面向对象思想和编程绪论编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(5)面向对象版本面向对象版本cball3.py炮炮弹是是现实实体体, ,用用xpos,ypos,xv和和yv四个分离的数四个分离的数据来描述它是据来描述它是“只只见树木不木不见森林森林”. .OOP:将炮将炮弹的信息和行的信息和行为都封装在都封装在类中中,并并创建一建一个炮个炮弹对象象,程序会更加程序会更加简洁易理解易理解.defmain():angle,vel,h0,t
24、ime=getInputs()cball=Projectile(angle,vel,h0)whilecball.getY()=0:cball.update(time)print射程射程:%0.1f米米.%(cball.getX()所有复所有复杂性都性都隐藏在藏在类中了中了32获剑衍冀敖聊奈讳抡亡肛出考纺踊贬穴蹬蛛奔董宏呐肘涌门羹酷吻稍柳冷面向对象思想和编程绪论编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(6)三个版本体现的思想变迁三个版本体现的思想变迁33虹派锦梧氖桐季馈叫谜羞民怂仍段曳淘溺已峻旗诣航咎佰根榴载亨汪捍膜面向对象思想和编程绪论类与模块化类与模块化复杂程序的模块化设计复杂程序的模块化
25、设计功能分解功能分解:利用子程序利用子程序(如函数如函数)概念概念,以以过程程为中心中心设计功能模功能模块数据分解数据分解:利用利用类的概念的概念,以数据以数据为中心中心设计数据模数据模块功能模块不太适合复杂数据的处理功能模块不太适合复杂数据的处理类模块独立性更高类模块独立性更高,可重用性更好可重用性更好类定定义可以提供可以提供给任何程序使用任何程序使用很多很多OO语言都提供言都提供类库34窍块线额迪住袖桥嘲庞祸像渗貌翁塘活疯载柿屡销姻显趁汐庶梧萄雕伏册面向对象思想和编程绪论例例:学生信息处理系统学生信息处理系统功能分解功能分解课程注册模程注册模块,修改学生信息模修改学生信息模块,成成绩登登录
26、模模块等等每个模每个模块(函数函数)都需要了解都需要了解”学生学生”数据的数据的细节数据分解数据分解创建建”学生学生”类S,隐藏数据和操作藏数据和操作实现细节,使使用者无需了解内部用者无需了解内部细节就能就能执行操作行操作其他数据模其他数据模块包括包括”课程程”类,”教教师”类等等35陷厅棚孪么掺答租跌雌授司残财马缎将兜讽胺越忍则岂那透肄鞍制预围贬面向对象思想和编程绪论如何表示任意复杂的数据如何表示任意复杂的数据数据的复杂性表现在数据的复杂性表现在数量大数量大:用集合体数据用集合体数据类型来表示型来表示有内部深有内部深层结构构:用用类来表示来表示两种复杂性混合两种复杂性混合:用用对象的集合对象
27、的集合来刻画来刻画people=p1,p2forpinpeople:p.whatName()p.howOld(2013) 36闭啤赎啪则拿状来沾鹰出舌场弘渣嘛葫亮颊锋仪浸遁锋走持服乾泽赃喷砾面向对象思想和编程绪论373737超类与子类超类与子类*子类子类继承继承覆写覆写多态多态窟触夕优碍粪禽潘蜒洗吁晒浇廊裳斧芭俏怒狰锈钮续呕舅癣殖残榜滔赏托面向对象思想和编程绪论383838面向对象设计面向对象设计*OOD:对给定问题找出并定义一组有用的对给定问题找出并定义一组有用的类的过程类的过程.基于词性分析的一种方法基于词性分析的一种方法问题描述描述描述中的名描述中的名词(事物事物)问题描述中的描述中的动词(对象行象行为)乍食堡遭岂莱劫燎萎渤顺俄僵锣浪焕芝垫毫咕怒联像度兰拖涝绣责寅品滑面向对象思想和编程绪论3939End僻辜裸等澡试违拔咋含天涨蛊讶没图铱配锐这稻擒雍醉衙靶职犁殿波渝暂面向对象思想和编程绪论