类的定义
类的定义
回顾:对象 ·对象的构成: -一组相关信息 人存储在实例变量中 一处理该信息的一组方法 人对象内的函数 0 类决定了对象具有哪些信息和方法 一对象是类的实例 一通过类的构造子创建新对象 ·定义自己的类:即以O0方法来组织自己程序要 处理的数据 Lu Chaojun,SJTU 2
Lu Chaojun, SJTU 2 回顾:对象 • 对象的构成: – 一组相关信息 ©存储在实例变量中 – 处理该信息的一组方法 ©对象内的函数 • 类决定了对象具有哪些信息和方法 – 对象是类的实例 – 通过类的构造子创建新对象 • 定义自己的类:即以OO方法来组织自己程序要 处理的数据
编程实例:炮弹模拟 ·程序规格 -输入:发射角,初速度,初始高度 -输出:射程 注:不用微积分,只用一些基本知识来算法化解决. 算法 输入模拟参数:角度,速度,高度,计算位置变化的时间间隔 计算炮弹初始位置xpos,ypos 计算炮弹初始水平和垂直速度xveL,yvel 当炮弹还在飞行,循环: 更新一个时间间隔之后的xpos,ypos,yvel 输出xpos Lu Chaojun,SJTU 3
Lu Chaojun, SJTU 3 编程实例:炮弹模拟 • 程序规格 – 输入:发射角,初速度,初始高度 – 输出:射程 注:不用微积分,只用一些基本知识来算法化解决. • 算法 输入模拟参数:角度,速度,高度,计算位置变化的时间间隔 计算炮弹初始位置xpos,ypos 计算炮弹初始水平和垂直速度xvel, yvel 当炮弹还在飞行,循环: 更新一个时间间隔之后的xpos, ypos, yvel 输出xpos Lu Chaojun, SJTU
编程实例:炮弹模拟(续) def main(): angle input("...(in degrees)") vel input ("...(in meters/sec") ho input ("...(in meters)") time input ("...(in seconds)") xpos,ypos 0,h0 theta angel math.pi /180.0 才 xvel vel math.cos(theta) velocity yvel=velocity*sin(theta) yvel vel math.sin(theta) theta while ypos >0.0: xvel velocity cos(theta) 更新 print"Distance:号0.1f meters."号(pos) Lu Chaojun,SJTU 4
Lu Chaojun, SJTU 4 编程实例:炮弹模拟 (续) def main(): angle = input("...(in degrees)") vel = input("...(in meters/sec") h0 = input("...(in meters)") time = input("...(in seconds)") xpos, ypos = 0, h0 theta = angel * math.pi / 180.0 xvel = vel * math.cos(theta) yvel = vel * math.sin(theta) while ypos >= 0.0: 更新 print "Distance: %0.1f meters." % (xpos) Lu Chaojun, SJTU
编程实例:炮弹模拟(续) ·算法核心部分:更新各值 xposxpos xvel time yvel new yvel -9.8 time ypos ypos time (yvelyvel new)/2 yvelyvel new 模块化设计: def main(): angle,vel,h0,time getInput ( xpos,ypos =0,h0 xvel,yvel getxYComponents(vel,angle) while ypos >0.0: xpos,ypos,yvel updatePos(time,xpos,ypos,xvel,yvel) print"Distance:号0.1f meters."号(xpos) -变量theta和vyel newl呢?-这是自顶向下逐步求精的SoC带来的好处 - 但updateData()似乎不太好? Lu Chaojun,SJTU 5
Lu Chaojun, SJTU 5 编程实例:炮弹模拟(续) • 算法核心部分:更新各值 xpos = xpos + xvel * time yvel_new = yvel 9.8 * time ypos = ypos + time * (yvel + yvel_new) / 2 yvel = yvel_new • 模块化设计: def main(): angle, vel, h0, time = getInput() xpos, ypos = 0, h0 xvel, yvel = getXYComponents(vel, angle) while ypos >= 0.0: xpos,ypos,yvel = updatePos(time,xpos,ypos,xvel,yvel) print "Distance: %0.1f meters." % (xpos) – 变量theta和vyel_new呢? --这是自顶向下逐步求精的SoC带来的好处 – 但updateData()似乎不太好?
编程实例:炮弹模拟(续) ·函数updateData()的弊端 -过多参数:5个参数,3个返回值 一函数参量过多通常意味着有更好的组织方式 ·OO设计:设计一个抛物体类Projectile.从而: def main(): angle,vel,h0,time getInput ( cball Porjectile(angle,vel,h0) while cball.gety()>=0.0: cball.update(time) print "Distance:$0.1f meters."(cball.getx()) - 隐藏了对炮弹的描述信息xpos,ypos,xvel,yvel Lu Chaojun,SJTU 6
Lu Chaojun, SJTU 6 编程实例:炮弹模拟(续) • 函数updateData()的弊端 – 过多参数: 5个参数,3个返回值. – 函数参量过多通常意味着有更好的组织方式 • OO设计:设计一个抛物体类Projectile.从而: def main(): angle, vel, h0, time = getInput() cball = Porjectile(angle,vel,h0) while cball.getY() >= 0.0: cball.update(time) print "Distance: %0.1f meters." % (cball.getX()) – 隐藏了对炮弹的描述信息:xpos, ypos, xvel, yvel
类的定义 ·语法 c1ass: 一方法定义:同函数定义 人方法是依附于类的函数.一般函数则是独立的. 人方法的第一个参量是专用的:指向方法的作用对 象. +传统上习惯用self这个名字 一回忆:对象是数据和操作的结合. 人上面的类定义中,方法对应于操作.但数据呢? Lu Chaojun,SJTU 7
类的定义 • 语法 class : – 方法定义:同函数定义. ©方法是依附于类的函数.一般函数则是独立的. ©方法的第一个参量是专用的:指向方法的作用对 象.ª传统上习惯用self这个名字. – 回忆:对象是数据和操作的结合. ©上面的类定义中,方法对应于操作.但数据呢? Lu Chaojun, SJTU 7
例:类定义 ·多面骰子 #msdie.py from random import randrange class MSDie: def init (self,s): self.sides s self.value 1 def roll(self): self.value randrange(1,self.sides+1) def getvalue(self): return self.value def setvalue(self,v): self.value v Lu Chaojun,SJTU 8
Lu Chaojun, SJTU 8 例:类定义 • 多面骰子 #msdie.py from random import randrange class MSDie: def __init__(self,s): self.sides = s self.value = 1 def roll(self): self.value = randrange(1,self.sides+1) def getValue(self): return self.value def setValue(self,v): self.value = v
实例变量 ·Python的类并不明显定义实例变量,而是在方法 中直接使用. - 主要是在init方法中(见后) 人用slf.的方式给出 人如MSDie中的sides和value ·每个类的实例(对象)具有自己的实例变量副本, 用来存储该对象自己的数据 ·对实例变量的访问: . ·实例变量与函数局部变量不同! Lu Chaojun,SJTU 9
实例变量 • Python的类并不明显定义实例变量,而是在方法 中直接使用. – 主要是在__init__方法中(见后) ©用self.的方式给出 ©如MSDie中的sides和value • 每个类的实例(对象)具有自己的实例变量副本, 用来存储该对象自己的数据. • 对实例变量的访问: . • 实例变量与函数局部变量不同! Lu Chaojun, SJTU 9
方法调用 ·方法调用:同函数调用,但需指明作用对象 -因此不需要再为形参self提供实参了, ·例如:主程序main)中执行 diel.setvalue(8) class MSDie: def main(): diel MSDie(12) self=diel;value=8 def setValue(self,value diel.setValue(8) self,value value print diel.getvalue Lu Chaojun,SJTU 10
方法调用 • 方法调用:同函数调用,但需指明作用对象. – 因此不需要再为形参self提供实参了. • 例如:主程序main()中执行 die1.setValue(8) Lu Chaojun, SJTU 10