类的定义(一)

上传人:小** 文档编号:54470548 上传时间:2018-09-13 格式:PPT 页数:23 大小:3.47MB
返回 下载 相关 举报
类的定义(一)_第1页
第1页 / 共23页
类的定义(一)_第2页
第2页 / 共23页
类的定义(一)_第3页
第3页 / 共23页
类的定义(一)_第4页
第4页 / 共23页
类的定义(一)_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《类的定义(一)》由会员分享,可在线阅读,更多相关《类的定义(一)(23页珍藏版)》请在金锄头文库上搜索。

1、第7讲 面向对象基础,讲课教师:常姗 2014. 5. 13,计算机编程导论 -Python语言,数据和对数据的操作被看作是分离的两件事情: 数据:信息表示,在程序中处于“被动”地位; 对数据的操作:处于“主动”地位,驱动程序实现特定功能的力量。程序员思考的主要问题:数据如何表示、对各数据执行什么操作、各操作的先后顺序如何安排。,面向过程观点(以操作为中心),基本观点:数据和对数据的操作不可分离。 对象(object):将数据和操作两者结合在一起,抽象出的一种实体。 对象拥有一些数据,同时也知道如何对这些数据进行操作。,面向对象观点(1),对象:广义的数据,消息(message):外部若想对某

2、个对象存储的数据进行操作,只能向对象发送一个表示操作请求的消息,由对象来响应这个请求,执行被特定的操作,并将结果告知请求者。 接口(interface):对象将它能响应的消息对外公布,这些消息构成了对象与外部进行交互的接口(界面),外部只能通过这个界面与对象打交道。,面向对象观点(2),Object-Orientation Programming,简称OOP,通过OOP所得到的程序是一个由很多对象组成的系统,可以向对象发送消息来实现对数据的处理,全体对象通过相互协作来完成程序的数据处理功能。,面向对象编程-OOP,“人”可视为“对象”: 每个人都具有自己的数据,如姓名、出生日期、身高、体重等;

3、 每个人对他的数据都有自己的操作方法,例如通过计算当前日期与出生日期的差值来得到年龄、通过公式“标准体重 =(身高100) 0.9)”来判断自己是否超重等。 每个人都能响应外部发来的消息(如询问年龄的消息),也就是执行相应的数据操作。,了解对象-举例,一个类是一种自定义的类型 int, bool, float, str 就是全世界了吗?No! 具有同一类属性的物体的抽象就是一个类 例如,人(类)、计算机(类)、树(类)等等 类除了具有特定的属性,还具有特定的行为(方法) 例如,人的身高、性别、年龄,计算机的存储大小、运算速度,树的年龄、粗细、高度 此外:人会吃饭,计算机会执行程序,树会光合作用

4、 因此,你就是造物主! 创造新的物种(类):将属性和方法封装在一起,类(Class),7,一个对象是一个类的某一个实例 例如,张三是人、李四也是人,台式机是计算机、平板电脑也是计算机,桃树是树、杏树也是树 卡拉是条狗 ,对象,8,假设为“学生”数据定义一个新的数据类型 S: S由学号、姓名、地址等简单数据项构成,称为S的属性。 定义能对S数据执行的操作,如修改姓名或年龄、读取地址等。 实现S:编程语言提供的基本类型+新类型定义机制。,类的定义(1),类:广义的数据类型,类用关键字class来定义 class :.: 每个方法定义其实都是一个函数定义,即形如: def ():. 每个方法都必须有

5、一个特殊的形参self,并且self必须是该方法的第一个形参。,类的定义(2),class Person:def _init_(self,n,y):self.name = nself.year = ydef whatName(self):print “My name is“,self.namedef howOld(self,y):age = y self.yearif age 0:print “My age in“,y,“is“,ageelse:print “I was born in“,self.year,定义类Person(1),Python 中,类的实例所拥有的数据一般在特殊方法_ini

6、t_中定义。,以“self.”形式定义的变量称为实 例变量。可在类的任何方法中直接引用。,无self前缀,则该变量是普通的函数局部变量,作用域仅限于该方法。,指明当前是哪个对象实例要执行类的方法。,class Person1:def _init_(self,n,y):self.name = nself.year = ydef whatName(self):print “My name is“,self.namedef howOld(self,y):age = y self.yearif age 0: print “My age in“,y,“is“,ageelse: print “I was

7、born in“,self.yeardef allInfo(self,y):self.whatName()self.howOld(y),定义类Person(2),类的方法定义中可以通过self.f()的方式调用同一个类中的其它方法f。,allInfo调用了本类中的另外两个方法whatName和howOld。,创建类的实例采用如下形式:= () 类名当成一个函数来用,称为类的构造器(constructor,或称构造函数)。 构造器返回一个新对象,通常需要定义来引用这个新对象。,创建对象,在类中定义_init_方法。 创建新对象时,自动调用_init_,实现新对象的初始化(如为该对象的数据赋值)。

8、 传参:_init_方法用参数(至少有参数self)传递初始化所需的信息,调用须提供相应实参。 _init_不是直接调用的,无法直接将实参传递给它,所以将所需实参传递给构造器,再由构造器自动传递给_init_。 _init_的特殊参数self是新创建的对象。,创建特定初始状态的对象(1), from person import Person p1 = Person(“Lucy“,2005)_init_(p1,“Lucy“,2005) 从而导致执行_init_的函数体,为新对象进行初始化: p1.name = “Lucy“ p1.year = 2005,创建特定初始状态的对象(2),先导入Per

9、son类,然后创建Person对象,并使变量p1引用该对象。,创建对象时自动调用_init_,该方法所需的三个参数self、n、y 分别用实参p1、“Lucy“和2005代入。,实例变量:值随实例的不同而不同,创建特定初始状态的对象(3),类与实例的关系就像模具与产品的关系, 同一个模具可以制造出大量的产品,这些产品总体上是相似的,但可能各有不同的细节。,向对象发消息来调用对象的方法。 消息格式:.() 例如: p1.whatName() My name is Lucy p2.whatName() My name is Tom p2.howOld(2013) My age in 2013 is

10、 23,对象方法调用,请求执行,方法定义中列出的形式参数由提供。,Python的惯例,对象实例由Python隐含地传递给self,输入:角度angle(度)、初速度v、高度h0、时间间隔t。 输出:射程(米) 计算初速度分量:将angle换算成弧度单位的theta; 计算xv = v * cos(theta),yv = v * sin(theta) 初始位置:(xpos,ypos) = (0,h0) 当炮弹还未落地(即ypos = 0.0):更新炮弹下一时段位置(xpos,ypos)和垂直速度分量yv; 输出xpos,编程实例:模拟炮弹飞行(1),xpos,水平位置更新:xpos = xpos

11、 + xv * t 垂直位置更新:向上速度每秒减少9.8米/秒,经过时段t,向上速度变成了 yv1 = yv - 9.8 * t 炮弹在时段t内垂直方向位移: (yv + yv1) / 2.0 * t 经过时段t 后,炮弹在垂直方向的新位置为ypos = ypos + (yv + yv1) / 2.0 * t,编程实例:模拟炮弹飞行(2),流水账式,编程实例:模拟炮弹飞行(3),from math import pi,sin,cosdef main():angle = input(“输入发射角度(度): “)v = input(“输入初速度(米/秒): “)h0 = input(“输入初始高度

12、(米): “)t = input(“输入时间间隔(秒): “)theta = (angle * pi) / 180.0xv = v * cos(theta)yv = v * sin(theta)xpos = 0ypos = h0while ypos = 0:xpos = xpos + t * xvyv1 = yv - t * 9.8ypos = ypos + t * (yv + yv1) / 2.0yv = yv1print “射程: %0.1f 米.“ % (xpos)main(),10个变量,模块化程序设计,编程实例:模拟炮弹飞行(4),def update(t,xpos,ypos,xv,

13、yv):xpos = xpos + t * xvyv1 = yv - t * 9.8ypos = ypos + t * (yv + yv1) / 2.0yv = yv1return xpos,ypos,yvdef 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)main(),from math import pi,sin,co

14、sdef getInputs():a = input(“输入发射角度(度): “)v = input(“输入初速度(米/秒): “)h = input(“输入初始高度(米): “)t = input(“输入时间间隔(秒): “)return a,v,h,tdef getXY(v,angle):theta = (angle * pi) / 180.0xv = v * cos(theta)yv = v * sin(theta)return xv,yv,Main中8个变量,龙套,面向对象编程(类:炮弹),编程实例:模拟炮弹飞行(5),from math import pi,sin,cos class

15、 Projectile:def _init_(self,angle,velocity,height):self.xpos = 0.0self.ypos = heighttheta = pi * angle / 180.0self.xv = velocity * cos(theta)self.yv = velocity * sin(theta)def update(self, time):self.xpos = self.xpos + time * self.xvyv1 = self.yv - 9.8 * timeself.ypos = self.ypos + time * (self.yv +

16、 yv1) / 2.0self.yv = yv1def getX(self):return self.xposdef getY(self):return self.ypos,def getInputs():a = input(“输入发射角度(度): “)v = input(“输入初速度(米/秒): “)h = input(“输入初始高度(米): “)t = input(“输入时间间隔(秒): “)return a,v,h,tdef main():angle,v,h0,t = getInputs()cball = Projectile(angle,v,h0)while cball.getY() = 0:cball.update(t)print “射程: %0.1f 米.“ % (cball.getX(),Main中仅使用4个初始数据。,编程实例:模拟炮弹飞行(6),

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 经营企划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号