Python语言程序设计(第2版) 课件 第9章 面向对象程序设计_第1页
Python语言程序设计(第2版) 课件 第9章 面向对象程序设计_第2页
Python语言程序设计(第2版) 课件 第9章 面向对象程序设计_第3页
Python语言程序设计(第2版) 课件 第9章 面向对象程序设计_第4页
Python语言程序设计(第2版) 课件 第9章 面向对象程序设计_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章面向对象程序设计面向对象程序设计概述类与对象属性和方法继承和多态面向对象程序设计应用举例9.1.1面向对象的基本概念1.对象现实世界中客观存在的事物称作对象(object),任何对象都具有各自的特征(属性)和行为(方法)。面向对象程序设计中的对象是现实世界中的客观事物在程序设计中的具体体现,它也具有自己的特征和行为。对象的特征用数据来表示,称为属性(property)。对象的行为用程序代码来实现,称为对象的方法(method)。总之,任何对象都是由属性和方法组成的。9.1面向对象程序设计概述2.类类(class)是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述。任何对象都是某个类的实例(instance)。在系统中通常有很多相似的对象,它们具有相同名称和类型的属性、响应相同的消息、使用相同的方法。将相似的对象分组形成一个类,每个这样的对象被称为类的一个实例,一个类中的所有对象共享一个公共的定义,尽管它们对属性所赋予的值不同。3.消息一个系统由若干个对象组成,各个对象之间通过消息(message)相互联系、相互作用。消息是一个对象要求另一个对象实施某项操作的请求。发送者发送消息,在一条消息中,需要包含消息的接收者和要求接收者执行某项操作的请求,接收者通过调用相应的方法响应消息,这个过程被不断地重复,从而驱动整个程序的运行。4.封装封装(encapsulation)是指把对象的数据(属性)和操作数据的过程(方法)结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过使用类提供的外部接口对该对象实施各项操作,保证了程序中数据的安全性。类是数据封装的工具,对象是封装的实现。类的访问控制机制体现在类的成员中可以有公有成员、私有成员和保护成员。对于外界而言,只需要知道对象所表现的外部行为,而不必了解内部实现细节。5.继承继承(inheritance)反映的是类与类之间抽象级别的不同,根据继承与被继承的关系,可分为基类和衍类,基类也称为父类,衍类也称为子类,正如“继承”这个词的字面含义一样,子类将从父类那里获得所有的属性和方法,并且可以对这些获得的属性和方法加以改造,使之具有自己的特点。6.多态多态(polymorphism)是指同一名字的方法产生了多个不同的动作行为,也就是不同的对象收到相同的消息时产生不同的行为方式。将多态的概念应用于面向对象程序设计,增强了程序对客观世界的模拟性,使得对象程序具有了更好的可读性,更易于理解,而且显著提高了软件的可复用性和可扩充性。9.1.2从面向过程到面向对象面向过程程序设计就是采用自顶向下的方法,分析出解决问题所需要的步骤,将程序分解为若干个功能模块,每个功能模块用函数来实现。一个面向对象的程序一般由类的声明和类的使用两部分组成。程序设计始终围绕“类”展开。通过声明类,构建了程序所要完成的功能,体现了面向对象程序设计的思想。在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类的概念。9.2.1类的定义在Python中,通过class关键字来定义类。定义类的一般格式如下:class类名:类体例如定义了一个Person类:classPerson:name='brenden'#定义了一个属性defprintName(self):#定义了一个方法print()9.2类与对象9.2.2对象的创建和使用在Python中,用赋值的方式创建类的实例,一般格式为:对象名=类名(参数列表)创建对象后,可以使用“.”运算符,通过实例对象来访问这个类的属性和方法(函数),一般格式为:对象名.属性名对象名.函数名()例如,语句“p=Person()”产生了一个Person的实例对象,此时可以用来调用类的name属性。例9-1类和对象应用示例。classCC:x=10#定义属性y=20#定义属性z=30#定义属性defshow(self):#定义方法print((self.x+self.y+self.z)/3)b=CC()#创建实例对象bb.x=30#调用属性xb.show()#调用方法show程序输出结果如下:26.6666666666666689.3.1属性和方法的访问控制1.属性的访问控制在Python中没有像C++中public和private这些关键字来区别公有属性和私有属性,它是以属性命名方式来区分,如果在属性名前面加了两个下划线“__”,则表明该属性是私有属性,否则为公有属性。方法也一样,如果在方法名前面加了2个下划线,则表示该方法是私有的,否则为公有的。9.3属性和方法例如:classPerson:name='brenden'age=18p=Person()print(,p.age)这里的name和age都是公有的,可以直接在类外通过对象名访问,如果想定义成私有的,则需在前面加2个下划线“__”。2.方法的访问控制在类中可以根据需要定义一些方法,定义方法采用def关键字,在类中定义的方法至少会有一个参数,,一般以名为“self”的变量作为该参数(用其他名称也可以),而且需要作为第一个参数。下面看一个例子。例9-2方法的访问控制使用示例。程序如下:classPerson:__name='brenden'__age=18defgetName(self):returnself.__namedefgetAge(self):returnself.__agep=Person()print(p.getName(),p.getAge())程序输出结果如下:brenden189.3.2类属性和实例属性1.类属性顾名思义,类属性(classattribute)就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本。对于公有的类属性,在类外可以通过类对象和实例对象访问。

例如:classPerson:name='brenden'#公有的类属性__age=18#私有的类属性p=Person()print()#正确,但不提倡print(P)#正确print(p.__age)#错误,不能在类外通过实例对象访问私有的类属性print(Person.__age)#错误,不能在类外通过类对象访问私有的类属性2.实例属性实例属性(instanceattribute)是不需要在类中显式定义,而在__init__构造函数中定义的,定义时以self作为前缀。在其他方法中也可以随意添加新的实例属性,但并不提倡这么做,所有的实例属性最好在__init__中给出。实例属性属于实例(对象),只能通过对象名访问。例如:>>>classCar:def__init__(self,c):self.color=c#定义实例对象属性deffun(self):self.length=1.83#给实例添加属性,但不提倡>>>s=Car('Red')>>>print(s.color)Red>>>s.fun()>>>print(s.length)1.839.3.3类的方法1.类中类中最常用的内置方法就是构造方法和析构方法。1)构造方法构造方法__init__(self,……)在生成对象时调用,可以用来进行一些属性初始化操作,不需要显式去调用,系统会默认去执行。构造方法支持重载,如果用户自己没有重新定义构造方法,系统就自动执行默认的构造方法。看下面的程序。例9-3构造方法使用示例。程序如下:classPerson:def__init__(self,name):self.PersonName=namedefsayHi(self):print('Hello,mynameis{}.'.format(self.PersonName))p=Person('Jasmine')p.sayHi()程序输出结果如下:Hello,mynameisJasmine.2)析构方法析构方法__del__(self)在释放对象时调用,支持重载,可以在其中进行一些释放资源的操作,不需要显式调用。下面的例子说明了类的普通成员函数以及构造方法和析构方法的作用。>>>classTest:def__init__(self):print('AAAAA')def__del__(self):print('BBBBB')defmyf(self):print('CCCCC')>>>obj=Test()AAAAA>>>obj.myf()CCCCC>>>delobjBBBBB2.类方法、实例方法和静态方法1)类方法类方法是类对象所拥有的方法,需要用修饰器“@classmethod”来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以“cls”作为第一个参数。当然可以用其他名称的变量作为其第一个参数,但是大都习惯以“cls”作为第一个参数的名字,所以一般用“cls”。能够通过实例对象和类对象去访问类方法。例如:>>>classPerson:place='Changsha'@classmethod#类方法,用@classmethod来进行修饰defgetPlace(cls):returncls.place>>>p=Person()>>>print(p.getPlace())#可以用过实例对象引用Changsha>>>print(Person.getPlace())#可以通过类对象引用Changsha类方法还有一个用途就是可以对类属性进行修改。例如:>>>classPerson:place='Changsha'@classmethoddefgetPlace(cls):returncls.place@classmethoddefsetPlace(cls,place1):cls.place=place1>>>p=Person()>>>p.setPlace('Shanghai')#修改类属性>>>print(p.getPlace())Shanghai>>>print(Person.getPlace())Shanghai2)实例方法实例方法是类中最常定义的成员方法,它至少有一个参数并且必须以实例对象作为其第一个参数,一般以名为'self'的变量作为第一个参数,当然可以以其他名称的变量作为第一个参数。在类外实例方法只能通过实例对象去调用,不能通过其他方式去调用。例如:>>>classPerson:place='Changsha'defgetPlace(self):#实例方法returnself.place>>>p=Person()>>>print(p.getPlace())#正确,可以用过实例对象引用Changsha>>>print(Person.getPlace())#错误,不能通过类对象引用实例方法3)静态方法静态方法需要通过修饰器“@staticmethod”来进行修饰,静态方法不需要多定义参数。例如:>>>classPerson:place='Changsha'@staticmethoddefgetPlace():#静态方法returnPerson.place>>>print(Person.getPlace())Changsha9.4.1继承在Python中,类继承的定义形式如下:class子类名(父类名):类体在定义一个类的时候,可以在类名后面紧跟一对括号,在括号中指定所继承的父类,如果有多个父类,多个父类名之间用逗号隔开。9.4继承和多态例9-4以大学里的学生和教师为例,可以定义一个父类UniversityMember,然后类Student和类Teacher分别继承类UniversityMember。9.4.2多重继承多重继承的定义形式是:class子类名(父类名1,父类名2,……):类体例9-5多重继承程序示例。classA():deffoo1(self):print("AAAAA")classB(A):deffoo2(self):

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论