您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > python课件Chapter10-ch
定义类222回顾:对象•对象的构成:–一组相关信息•存储在实例变量中–处理该信息的一组方法•对象内的函数•类决定了对象具有哪些信息和方法–对象是类的实例–通过类的构造函数创建新对象•定义自己的类:即以OO方法来组织自己程序要处理的数据.3回顾:对象•由类创建新对象——调用构造函数,我们把类看做模型,由模型刻出同类而不同表现的对象实例。•考虑创建一个新的圆对象:myCircle=Circle(Point(0,0),20)•Circle—类名(构造函数名),构造函数与类同名,即Python用__init__函数构造新对象。•myCircle是产生新的Circle实例,数据存储在myCircle对象空间内•传给构造函数的参数初始化当前实例变量myCircle(centerandradius)。•对象创建后,它调用类内的各种方法实现相应的操作:myCircle.draw(win)myCircle.move(dx,dy)44编程实例:炮弹模拟•程序规格–输入:发射角,初速度,初始高度–输出:射程注:不用微积分,只用一些基本知识来算法化解决.•算法输入模拟参数:角度,速度,高度,计算位置变化的时间间隔计算炮弹初始位置xpos,ypos计算炮弹初始水平和垂直速度xvel,yvel当炮弹还在飞行,循环:更新一个时间间隔之后的xpos,ypos,yvel输出xpos55编程实例:抛物体模拟(续)defmain():angle=input(...(indegrees))vel=input(...(inmeters/sec)h0=input(...(inmeters))time=input(...(inseconds))xpos,ypos=0,h0theta=angel*math.pi/180.0xvel=vel*math.cos(theta)yvel=vel*math.sin(theta)whileypos=0.0:更新printDistance:%0.1fmeters.%(xpos)PythonProgramming,2/e6编程实例:抛物体模拟(续)-cball1#cball1.py#Simulationoftheflightofacannonball(orotherprojectile)#Thisversionisnotmodularized.frommathimportpi,sin,cosdefmain():angle=eval(input(Enterthelaunchangle(indegrees):))vel=eval(input(Entertheinitialvelocity(inmeters/sec):))h0=eval(input(Entertheinitialheight(inmeters):))time=eval(input(Enterthetimeintervalbetweenpositioncalculations:))radians=(angle*pi)/180.0xpos=0ypos=h0xvel=vel*cos(radians)yvel=vel*sin(radians)whileypos=0:xpos=xpos+time*xvelyvel1=yvel-9.8*timeypos=ypos+time*(yvel+yvel1)/2.0yvel=yvel1print(\nDistancetraveled:{0:0.1f}meters..format(xpos))main()Ycodes777编程实例:抛物体模拟(续)•算法核心部分:不断更新各变量的值xpos=xpos+xvel*timeyvel_new=yvel9.8*timeypos=ypos+time*(yvel+yvel_new)/2yvel=yvel_new888编程实例:抛物体模拟(续)•模块化设计:defmain():angle,vel,h0,time=getInput()xpos,ypos=0,h0xvel,yvel=getXYComponents(vel,angle)whileypos=0.0:xpos,ypos,yvel=updatePos(time,xpos,ypos,xvel,yvel)printDistance:%0.1fmeters.%(xpos)–问:变量theta和vyel_new呢?•这正是自顶向下逐步求精的SoC带来的好处–但updatePos()似乎不太好?999编程实例:抛物体模拟(续)•函数updatePos()的弊端–参数过多:5个参数,3个返回值.–函数参量过多通常意味着有更好的组织方式•OO设计:设计一个抛物体类Projectile.从而:defmain():angle,vel,h0,time=getInput()cball=Porjectile(angle,vel,h0)whilecball.getY()=0.0:cball.update(time)printDistance:%0.1fmeters.%(cball.getX())–隐藏了对炮弹的描述信息:xpos,ypos,xvel,yvel编程实例:抛物体模拟(续)-cball3•Cball3.py中类的定义classProjectile:def__init__(self,angle,velocity,height):self.xpos=0.0self.ypos=heighttheta=pi*angle/180.0self.xvel=velocity*cos(theta)self.yvel=velocity*sin(theta)defupdate(self,time):self.xpos=self.xpos+time*self.xvelyvel1=self.yvel-9.8*timeself.ypos=self.ypos+time*(self.yvel+yvel1)/2.0self.yvel=yvel1defgetY(self):returnself.yposdefgetX(self):returnself.xpos注意:self.变量是对象内的数据成员类的定义•语法class类名:方法定义–方法定义:同函数定义.•方法是依附于类的函数,普通函数则是独立的.•方法的第一个参数是专用的:代指该方法的作用对象.–此参量习惯用self这个名字.–回忆:对象是数据和操作的结合.•上面的类定义中,方法对应于操作.但数据呢?11121212例:类定义•多面骰子#msdie.pyfromrandomimportrandrangeclassMSDie:def__init__(self,s):self.sides=sself.value=1defroll(self):self.value=randrange(1,self.sides+1)defgetValue(self):returnself.valuedefsetValue(self,v):self.value=v实例变量•和普通变量一样,Python类并不明显定义实例变量,而是在方法中直接引入.–主要是在__init__方法中(见后)•用self.实例变量的方式给出•如MSDie中的sides和value•每个类的实例(对象)具有自己的实例变量副本,用来存储该对象自己的数据.•对实例变量的访问:对象.实例变量•实例变量与函数局部变量不同!13方法调用•方法调用:类似函数调用,但需指明对象.–不需要为形参self提供实参.•例如:主程序main()中执行die1.setValue(8)14构造器•对象构造器(constructor)__init__•用法:(1)在类外部用类名生成新实例:die1=MSDie(6)(2)Python创建一个MSDie新实例,并对该实例调用__init__(),从而初始化其实例变量:die1.sides=6die1.value=115PythonProgramming,2/e16编程实例:掷多面骰子#msdie.py#Classdefinitionforann-sideddie.fromrandomimportrandrangeclassMSDie:def__init__(self,sides):self.sides=sidesself.value=1defroll(self):self.value=randrange(1,self.sides+1)defgetValue(self):returnself.valuedefsetValue(self,value):self.value=valueY编程实例:掷多面骰子die1=MSDie(6)die1.getValue()1die1.roll()die1.getValue()5die2=MSDie(13)die2.getValue()1die2.roll()die2.getValue()9die2.setValue(8)die2.getValue()8编程实例:Projectile类•构造器–实例变量:xpos,ypos,xvel,yvel–构造器需要三个初值来为实例变量初始化:cball=Projectile(angle,vel,h0)–因此得到:def__init__(self,a,v,h):self.xpos=0self.ypos=htheta=math.pi*a/180self.xvel=v*math.cos(theta)self.yvel=v*math.sin(theta)18编程实例:Porjectile类(续)•读取实例变量的方法defgetX(self):returnself.xposdefgetY(self):returnself.ypos•更新实例变量的方法:defupdate(self,time):self.xpos=self.xpos+self.xvel*timeyvelnew=self.yvel–9.8*timeyvelavg=(self.yvel+yvelnew)/2self.ypos=self.ypos+yvelavg*timeself.yvel=yvelnew•OO版抛物体模拟程序:cball3.py19编程实例:Porjectile类(续)-cball3frommathimportpi,sin,cosclassProjectile:def__init__(self,angle,velocity,height):┆defupdate(self,time):self.xpos=self.xpos+time*self.xvel┆defgetY(self):┆defgetX(self):┆defgetInputs():┆defmain():angle,vel,h0,time=getInputs()cball=Projectile(angle,vel,h0)whilecball.getY()=0:cball.update(time)print\nDistancetraveled:%0.1fmeters.%(cball.getX())main()21编程实例:Student数据处理类•通常,学校描述一个学生信息:姓名,学号,班号,寝室,地址,联系方式,成绩…•学生统计学生学积分:A为4点平均积分,B为3点平均学积分•学生学分信息文件:namecredit-hoursqualitypointsAdams,Henry127228Comptewell,Susan100400DibbleBit,Denny1841.5Jones,Jim48.5155Smith,Frank37125.3322编程实例:Student数据处理类•classStudent:def__init__(self,name,hours,qpoints):self.name=nameself.hours=float(hours)self.qpoints=float(qp
本文标题:python课件Chapter10-ch
链接地址:https://www.777doc.com/doc-5915656 .html