《上海交通大学-python程序设计课程PPT-Ch7-..优秀PPT.ppt》由会员分享,可在线阅读,更多相关《上海交通大学-python程序设计课程PPT-Ch7-..优秀PPT.ppt(68页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面对对象思想和编程面对对象思想和编程2 2 2回顾回顾程序包括程序包括数据数据数据类型数据类型,数据结构数据结构处理过程处理过程算法算法两种程序设计思想两种程序设计思想面对过程面对过程:以操作为中心以操作为中心面对对象面对对象:以数据为中心以数据为中心3 3 3数据与操作数据与操作:面对过程观点面对过程观点程序就是对数据进行一系列的操作程序就是对数据进行一系列的操作先表示数据先表示数据:常量常量,变量变量再来处理数据再来处理数据x=1y=2z=x+yprint z 特点特点:数据与操作分别数据与操作分别数据是被动的数据是被动的,操作是主动的操作是主动的4 4以过程为中心以过程为中心准备好数据之
2、后准备好数据之后,主要是进行数据处理过主要是进行数据处理过程的设计程的设计,即算法设计即算法设计.这种设计方法中这种设计方法中,数据通常对整个处理过数据通常对整个处理过程都是公开的程都是公开的,不能隐藏数据不能隐藏数据.x=1y=2z=x+yw=x y#和上一行处理同样的数据和上一行处理同样的数据x,yz=z*w print z5 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+resu
3、lt2 函数可以看作是更高函数可以看作是更高抽象级的操作抽象级的操作,与一般与一般操作似乎并无本质差别操作似乎并无本质差别.x=1y=2res=x+yprintres但函数有数据隐藏功能但函数有数据隐藏功能6 6函数与数据隐藏函数与数据隐藏函数是功能黑箱函数是功能黑箱运用者须要的只是函数的功能运用者须要的只是函数的功能,并不须要并不须要知晓它内部是如何实现功能的知晓它内部是如何实现功能的函数内部处理的数据不对函数外部开放函数内部处理的数据不对函数外部开放一个函数不能干脆访问另一个函数内部一个函数不能干脆访问另一个函数内部的数据的数据7 7小结小结:面对过程设计面对过程设计数据与操作分别数据与操
4、作分别,以操作过程为中心以操作过程为中心先表示数据先表示数据主要精力放在设计数据操作及其流程限主要精力放在设计数据操作及其流程限制制对困难程序接受自顶向下设计和模块化对困难程序接受自顶向下设计和模块化设计设计将运用低级别操作的困难过程设计成运将运用低级别操作的困难过程设计成运用高级别操作的简洁过程用高级别操作的简洁过程 不适合的应用不适合的应用:如如GUI程序程序没有明确的执行流程没有明确的执行流程,由不行预知的事务由不行预知的事务驱动处理过程驱动处理过程8 8数据与操作数据与操作:面对对象观点面对对象观点数据与操作不行分别数据与操作不行分别数据类型概念已经提示我们数据类型概念已经提示我们:特
5、定数据值特定数据值和特定操作是不行分割的两件事情和特定操作是不行分割的两件事情Q:请问请问x+y是什么意思是什么意思?A:+对不同类型的对不同类型的x,y值有不同意义值有不同意义.既然如此既然如此,何不将特定数据值何不将特定数据值与特定操作捆绑在一起与特定操作捆绑在一起,形成一形成一种新型种新型数据数据?由此产生了对象概念由此产生了对象概念9 9对象对象对象对象(Object):集数据与操作于一身集数据与操作于一身.对象拥有特定数据对象拥有特定数据对象能对其数据进行特定操作对象能对其数据进行特定操作计算计算:向对象发操作恳求消息向对象发操作恳求消息.对象是主动的对象是主动的,自己掌控对其数据的
6、操作自己掌控对其数据的操作对象将自己能执行的操作对外公开对象将自己能执行的操作对外公开面对对象面对对象(Object-Oriented):软件系统由软件系统由各种对象组成各种对象组成,对象之间通过消息进行交对象之间通过消息进行交互互.1010对象例子对象例子人人数据数据:姓名姓名,诞生日期诞生日期,身高身高,体重体重,.操作操作:计算年龄计算年龄,推断体重是否标推断体重是否标准准,.电视机电视机数据数据:型号型号,厂商厂商,尺寸尺寸,频道数频道数,.操作操作:开机开机,关机关机,调频道调频道,调音量调音量,.室内环境室内环境数据数据:温度温度,湿度湿度,容积容积,.操作操作:调整温度调整温度,
7、调整湿度调整湿度,换算容换算容积单位积单位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定义一些
8、对值的运算定义一些对值的运算(操作操作):如如+,-,*,/困难数据如何表示困难数据如何表示?拆成简洁数据拆成简洁数据例如例如学生学生拆成拆成name,age,addr等简洁数等简洁数据据定义新类型定义新类型例如定义类型例如定义类型S,其值是由其值是由name,age,addr等构成的整体等构成的整体131313自定义类型的值和操作自定义类型的值和操作分别分别融为一体融为一体141414从类型到类从类型到类类是类型概念的发展类是类型概念的发展对象是广义的对象是广义的数据值数据值对象所属的数据类型就是对象所属的数据类型就是类类用于描述困难数据的静态和动态行为用于描述困难数据的静态和动态行为类类(
9、class):描述相像对象的共性描述相像对象的共性.包括包括数据数据操作操作:方法方法(method)对象是类的实例对象是类的实例151515类与抽象类与抽象类是对现实事物的抽象类是对现实事物的抽象数据抽象数据抽象例如例如:从具体学生抽象出姓名从具体学生抽象出姓名,年龄年龄,地址地址等数据等数据行为抽象行为抽象例如例如:从学生日常行为抽象出选课从学生日常行为抽象出选课,加入加入社团等操作社团等操作于是产生了类于是产生了类Student的定义的定义抽象可以在多个层次上进行抽象可以在多个层次上进行例如例如:学生学生-人人-动物动物-生物生物161616封装封装封装封装:数据和操作结合成一个程序单元
10、数据和操作结合成一个程序单元,对外部隐藏内部实现微小环节对外部隐藏内部实现微小环节.不允许用户干脆操作类中被隐藏的信息不允许用户干脆操作类中被隐藏的信息 用户也无需了解隐藏的信息就能运用该用户也无需了解隐藏的信息就能运用该类类类对外公开方法名称和调用格式类对外公开方法名称和调用格式,即界面即界面.外界向对象发消息外界向对象发消息(方法名及参数方法名及参数)对象响应消息对象响应消息,执行相应方法执行相应方法外界只能按对象允许的方式来处理对象外界只能按对象允许的方式来处理对象数据数据171717封装的好处封装的好处平安平安:对象自己的方法处理自己的数据对象自己的方法处理自己的数据易用易用:运用者无
11、需了解内部实现微小环节运用者无需了解内部实现微小环节易维护易维护:实现者修改内部实现不会影响运实现者修改内部实现不会影响运用者用者标准化标准化:同类甚至不同类的对象对运用者同类甚至不同类的对象对运用者都呈现同样的操作界面都呈现同样的操作界面类的定义类的定义类定义类定义class:方法定义同函数定义方法定义同函数定义def():.方法是依附于类的函数方法是依附于类的函数,一般函数则是独一般函数则是独立的立的.方法的第一个参数是专用的方法的第一个参数是专用的,习惯用名字习惯用名字self.具体含义见后具体含义见后.只能通过向对象发消息来调用方法只能通过向对象发消息来调用方法.18实例变量实例变量(
12、1)回忆回忆:对象是数据和操作的结合对象是数据和操作的结合.类定义中类定义中,方法对应于操作方法对应于操作.数据呢数据呢?对象的数据以实例变量形式定义对象的数据以实例变量形式定义.实例变量实例变量self.在方法中定义在方法中定义self.=主要出现在主要出现在_init_()方法中方法中19实例变量实例变量(2)每个类实例每个类实例(对象对象)具有自己的实例变量具有自己的实例变量副本副本,用来存储该对象自己的数据用来存储该对象自己的数据.对实例变量的访问对实例变量的访问:.实例变量与函数局部变量不同实例变量与函数局部变量不同!同一个类的各个方法都可以访问实例变量同一个类的各个方法都可以访问实
13、例变量.类的方法中也可以定义局部变量类的方法中也可以定义局部变量,不能被其他不能被其他方法访问方法访问.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
14、)类与实例类与实例:抽象与具体抽象与具体.人人是类是类,张三张三是人的实例是人的实例一个类可以创建随意多个实例一个类可以创建随意多个实例各实例具有相同的行为各实例具有相同的行为:由方法确定由方法确定但具有不同的数据但具有不同的数据:由实例变量确定由实例变量确定实例创建实例创建=()这里这里相当于一个函数相当于一个函数,称为构造器称为构造器,用来构造实例用来构造实例.22实例创建实例创建(2)创建时对实例进行初始化创建时对实例进行初始化用构造器创建实例时用构造器创建实例时,系统会自动调用系统会自动调用_init_方法方法通常在此方法中执行一些初始化操作通常在此方法中执行一些初始化操作_init_
15、所需的参数由构造器供应所需的参数由构造器供应.例如例如:from person import Person p1=Person(Lucy,2005)23例例:实例创建实例创建(1)创建一个创建一个Person实例实例frompersonimportPersonp1=Person(Lucy,2005)24例例:实例创建实例创建(2)创建两个创建两个Person实例实例frompersonimportPersonp1=Person(Lucy,2005)p2=Person(Tom,1990)25方法调用方法调用类似函数调用类似函数调用,但需指明实例但需指明实例(对象对象).()就是与形参就是与形参s
16、elf对应的实参对应的实参.例如例如p1.whatName()MynameisLucyp2.whatName()MynameisTomp2.howOld(2013)Myagein2013is23 26方法调用图示方法调用图示p1.whatName()p2.howOld(2013)27编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(1)程序规格程序规格输入输入:炮弹的放射角度炮弹的放射角度,初速和高度初速和高度输出输出:炮弹的射程炮弹的射程解决方法解决方法:模拟炮弹飞行过程模拟炮弹飞行过程,即计算每即计算每一时刻炮弹的位置一时刻炮弹的位置.连续运动的离散化连续运动的离散化时间时间:t,t+t,t+2
17、t,t+3t,.轨迹轨迹:(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)核心代码核心代码:位
18、置更新位置更新水平方向水平方向xpos=xpos+xv*t垂直方向垂直方向yv1=yv-9.8*typos=ypos+(yv+yv1)/2.0*t30from math import pi,sin,cosdef main():angle=input(Enter the launch angle:)vel=input(Enter the initial velocity:)h0=input(Enter the initial height:)time=input(Enter the time interval:)radians=(angle*pi)/180.0 xpos=0 ypos=h0 xv
19、el=vel*cos(radians)yvel=vel*sin(radians)while ypos=0:xpos=xpos+time*xvel yvel1=yvel-9.8*time ypos=ypos+time*(yvel+yvel1)/2.0 yvel=yvel1 print nDistance traveled:%0.1f meters.%(xpos)main()这个版本是流水帐式的,没有章法结构.程序不长,倒有10个变量,为理解程序须要跟踪这10个数据的变更.编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(4)模块化版本模块化版本cball2.py主程序主程序(主函数主函数)特殊简洁特殊
20、简洁,易理解易理解.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函数界面太困难函数界面太困难.32编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(5)面对对象版本面对对象版本cball3.py炮弹是现实实体炮弹是现实实体,用用xpos,yp
21、os,xv和和yv四个分别四个分别的数据来描述它是的数据来描述它是“只见树木不见森林只见树木不见森林”.OOP:将炮弹的信息和行为都封装在类中将炮弹的信息和行为都封装在类中,并创并创建一个炮弹对象建一个炮弹对象,程序会更加简洁易理解程序会更加简洁易理解.def main():angle,vel,h0,time=getInputs()cball=Projectile(angle,vel,h0)while cball.getY()=0:cball.update(time)print 射程射程:%0.1f 米米.%(cball.getX()全部困难性都隐藏在类中了全部困难性都隐藏在类中了33from
22、 math import pi,sin,cosclass Projectile:def _init_(self,angle,velocity,height):self.xpos=0.0 self.ypos=height theta=pi*angle/180.0 self.xvel=velocity*cos(theta)self.yvel=velocity*sin(theta)def update(self,time):self.xpos=self.xpos+time*self.xvel yvel1=self.yvel-9.8*time self.ypos=self.ypos+time*(sel
23、f.yvel+yvel1)/2.0 self.yvel=yvel1def getY(self):return self.yposdef getX(self):return self.xpos编程案例编程案例:模拟炮弹飞行模拟炮弹飞行(6)三个版本体现的思想变迁三个版本体现的思想变迁35类与模块化类与模块化困难程序的模块化设计困难程序的模块化设计功能分解功能分解:利用子程序利用子程序(如函数如函数)概念概念,以以过程为中心设计功能模块过程为中心设计功能模块数据分解数据分解:利用类的概念利用类的概念,以数据为中心以数据为中心设计数据模块设计数据模块功能模块不太适合困难数据的处理功能模块不太适合困难
24、数据的处理类模块独立性更高类模块独立性更高,可重用性更好可重用性更好类定义可以供应应任何程序运用类定义可以供应应任何程序运用很多很多OO语言都供应类库语言都供应类库36例例:学生信息处理系统学生信息处理系统功能分解功能分解课程注册模块课程注册模块,修改学生信息模块修改学生信息模块,成果成果登录模块等登录模块等每个模块每个模块(函数函数)都须要了解都须要了解”学生学生”数数据的微小环节据的微小环节数据分解数据分解创建创建”学生学生”类类S,隐藏数据和操作实现微隐藏数据和操作实现微小环节小环节,运用者无需了解内部微小环节就运用者无需了解内部微小环节就能执行操作能执行操作其他数据模块包括其他数据模块
25、包括”课程课程”类类,”老师老师”类等类等37如何表示随意困难的数据如何表示随意困难的数据数据的困难性表现在数据的困难性表现在数量大数量大:用集合体数据类型来表示用集合体数据类型来表示有内部深层结构有内部深层结构:用类来表示用类来表示两种困难性混合两种困难性混合:用用对象的集合对象的集合来刻画来刻画 people=p1,p2 for p in people:p.whatName()p.howOld(2013)38393939超类与子类超类与子类*子类子类继承继承覆写覆写多态多态404040面对对象设计面对对象设计*OOD:对给定问题找出并定义一组有用的对给定问题找出并定义一组有用的类的过程类的
26、过程.基于词性分析的一种方法基于词性分析的一种方法问题描述问题描述描述中的名词描述中的名词(事物事物)问题描述中的动词问题描述中的动词(对象行为对象行为)41EndFunctions that Modify ParametersnReturn values are the main way to send information from a function back to the caller.nSometimes,we can communicate back to the caller by making changes to the function parameters.nUnde
27、rstanding when and how this is possible requires the mastery of some subtle details about how assignment works and the relationship between actual and formal parameters.Functions that Modify ParametersnSuppose you are writing a program that manages bank accounts.One function we would need to do is t
28、o accumulate interest on the account.Lets look at a first-cut at the function.ndef addInterest(balance,rate):newBalance=balance*(1+rate)balance=newBalanceFunctions that Modify ParametersnThe intent is to set the balance of the account to a new value that includes the interest amount.nLets write a ma
29、in program to test this:def test():amount=1000 rate=0.05 addInterest(amount,rate)print amountFunctions that Modify ParametersnWe hope that that the 5%will be added to the amount,returning 1050.n test()1000nWhat went wrong?Nothing!Functions that Modify ParametersnThe first two lines of the test funct
30、ion create two local variables called amount and rate which are given the initial values of 1000 and 0.05,respectively.def addInterest(balance,rate):newBalance=balance*(1+rate)balance=newBalancedef test():amount=1000 rate=0.05 addInterest(amount,rate)print amountFunctions that Modify ParametersnCont
31、rol then transfers to the addInterest function.nThe formal parameters balance and rate are assigned the values of the actual parameters amount and rate.nEven though rate appears in both,they are separate variables(because of scope rules).def addInterest(balance,rate):newBalance=balance*(1+rate)balan
32、ce=newBalancedef test():amount=1000 rate=0.05 addInterest(amount,rate)print amountFunctions that Modify ParametersnThe assignment of the parameters causes the variables balance and rate in addInterest to refer to the values of the actual parameters!def addInterest(balance,rate):newBalance=balance*(1
33、+rate)balance=newBalancedef test():amount=1000 rate=0.05 addInterest(amount,rate)print amountFunctions that Modify ParametersFunctions that Modify ParametersnExecuting the first line of addInterest creates a new variable,newBalance.nbalance is then assigned the value of newBalance.def addInterest(ba
34、lance,rate):newBalance=balance*(1+rate)balance=newBalancedef test():amount=1000 rate=0.05 addInterest(amount,rate)print amountFunctions that Modify Parametersnbalance now refers to the same value as newBalance,but this had no effect on amount in the test function.def addInterest(balance,rate):newBal
35、ance=balance*(1+rate)balance=newBalancedef test():amount=1000 rate=0.05 addInterest(amount,rate)print amountFunctions that Modify ParametersFunctions that Modify ParametersnExecution of addInterest has completed and control returns to test.nThe local variables,including the parameters,in addInterest
36、 go away,but amount and rate in the test function still refer to their initial values!def addInterest(balance,rate):newBalance=balance*(1+rate)balance=newBalancedef test():amount=1000 rate=0.05 addInterest(amount,rate)print amountFunctions that Modify ParametersnTo summarize:the formal parameters of
37、 a function only receive the values of the actual parameters.The function does not have access to the variable that holds the actual parameter.nPython is said to pass all parameters by value.Functions that Modify ParametersnSome programming languages(C+,Ada,and many more)do allow variables themselve
38、s to be sent as parameters to a function.This mechanism is said to pass parameters by reference.nWhen a new value is assigned to the formal parameter,the value of the variable in the calling program actually changes.Functions that Modify ParametersnSince Python doesnt have this capability,one altern
39、ative would be to change the addInterest function so that it returns the newBalance.Functions that Modify Parametersdef addInterest(balance,rate):newBalance=balance*(1+rate)return newBalancedef test():amount=1000 rate=0.05 amount=addInterest(amount,rate)print amounttest()Functions that Modify Parame
40、tersnInstead of looking at a single account,say we are writing a program for a bank that deals with many accounts.We could store the account balances in a list,then add the accrued interest to each of the balances in the list.nWe could update the first balance in the list with code like:balances0=ba
41、lances0*(1+rate)Functions that Modify ParametersnThis code says,“multiply the value in the 0th position of the list by(1+rate)and store the result back into the 0th position of the list.”nA more general way to do this would be with a loop that goes through positions 0,1,length 1.Functions that Modif
42、y Parametersdef addInterest(balances,rate):for i in range(len(balances):balancesi=balancesi*(1+rate)def test():amounts=1000,2200,800,360 rate=0.05 addInterest(amounts,rate)print amountstest()Functions that Modify ParametersnRemember,our original code had these values:1000,2200,800,360n The program r
43、eturns:1050.0,2310.0,840.0,378.0nWhat happened?Python passes parameters by value,but it looks like amounts has been changed!Functions that Modify ParametersnThe first two lines of test create the variables amounts and rate.nThe value of the variable amounts is a list object that contains four int va
44、lues.def addInterest(balances,rate):for i in range(len(balances):balancesi=balancesi*(1+rate)def test():amounts=1000,2200,800,360 rate=0.05 addInterest(amounts,rate)print amountsFunctions that Modify ParametersFunctions that Modify ParametersnNext,addInterest executes.The loop goes through each inde
45、x in the range 0,1,length 1 and updates that value in balances.def addInterest(balances,rate):for i in range(len(balances):balancesi=balancesi*(1+rate)def test():amounts=1000,2200,800,360 rate=0.05 addInterest(amounts,rate)print amountsFunctions that Modify ParametersFunctions that Modify Parameters
46、nIn the diagram the old values are left hanging around to emphasize that the numbers in the boxes have not changed,but the new values were created and assigned into the list.nThe old values will be destroyed during garbage collection.def addInterest(balances,rate):for i in range(len(balances):balanc
47、esi=balancesi*(1+rate)def test():amounts=1000,2200,800,360 rate=0.05 addInterest(amounts,rate)print amountsFunctions that Modify ParametersnWhen addInterest terminates,the list stored in amounts now contains the new values.nThe variable amounts wasnt changed(its still a list),but the state of that l
48、ist has changed,and this change is visible to the calling program.Functions that Modify ParametersnParameters are always passed by value.However,if the value of the variable is a mutable object(like a list of graphics object),then changes to the state of the object will be visible to the calling program.