Python程序设计 课件 第五章 面向对象_第1页
Python程序设计 课件 第五章 面向对象_第2页
Python程序设计 课件 第五章 面向对象_第3页
Python程序设计 课件 第五章 面向对象_第4页
Python程序设计 课件 第五章 面向对象_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第五章面向对象Python程序设计01面向对象简介02类与对象03类的继承与组合04本章回顾01面向对象面向对象(ObjectOriented)是一种编程思想,是基于面向过程的编程思想慢慢发展而来的。面向对象与面向过程面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候依次调用就可以了。而面向对象是把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为,面向对象是一种“自下而上”的设计语言,先设计组件,再完成拼装。面向对象相较于面向过程有更强的灵活性和扩展性。面向过程与面向对象举例以剪刀石头布游戏为例来理解面向过程和面向对象思想的区别,面向过程的设计思路就是按照步骤来实现:①开始游戏。②玩家1出剪刀或石头或布。③玩家2出剪刀或石头或布。④根据玩家出的结果判断输赢。⑤重复步骤2、3、4,直到退出游戏。面向对象的设计则是从另外的思路来解决问题,整个游戏中玩家1和玩家2属性和行为一致,可以用玩家类表示,判断输赢可以用游戏规则类表示,程序的实现步骤如下:①使用玩家类接收用户输入并将输入结果传递给游戏规则类。②利用游戏规则类中的方法对输赢进行判定。从上面的案例可以看出,针对同一个问题,面向过程和面向对象解决问题的思路有很大差异,从面向过程到面向对象,不仅仅是编程方式的改变,更重要的是思考方式的改变。面向过程与面向对象区别面向过程更注重步骤与过程,不注重职责与分工,在开发简单系统可行,但面对复杂大型系统时代码会冗杂。面向对象注重职责与分工,完成需求前先确定职责,再根据职责确定对象并封装方法,最后根据业务需求让不同对象调用不同方法。同时提到有面向过程和面向对象区别的总结表(下表)。面向对象基本概念学习面向对象编程需先了解相关概念。1.对象:在Python中一切皆为对象,如人、鸡、花等都可表示为对象,具有唯一性,有属性和行为,属性是静态部分如人的名字、性别等,行为是动态部分如吃饭、睡觉、工作等。2.类:是具有相同属性和方法的对象的集合,是对象的模板,可对共有的属性和方法进行定义,如狗的类有嘴、眼睛、腿等属性和睡觉、吃东西、摇尾巴等行为,邻居家小狗是该类的一个对象。3.实例化:创建类的实例即生成具体对象,如“狗”是类,自己养的宠物狗XX是实例化后的实例对象。类和对象的关系类和对象的关系可总结为以下几点:①类是对象的模板,对象是类的具体实例。②类是抽象的,对象是具体的。③每一个对象都是某个类的实例。面向对象程序设计的特点面向对象程序设计有封装、继承、多态三大特点。

封装:是面向对象编程核心思想,把客观事物封装成类,可将相同属性和行为的对象封装成类并隐藏不必要信息,确保类内部数据完整。优点包括减少耦合、可自由修改类内部结构、保护成员属性、隐藏信息实现细节。

继承:是面向对象程序设计基石,实现代码复用。子类继承父类特征和行为,可定义自己的属性和方法。优点有提高类代码复用性、可维护性,使类之间产生关系且是多态前提。

多态:允许不同类对象对同一消息有不同响应,通过动态绑定实现,同一操作作用不同对象有不同结果。存在条件为继承、子类重写父类方法、父类引用变量指向子类对象。02类与对象在生活中先有对象再有类,而在程序中是先有类才能有对象。在Python中,类的定义使用class关键字实现,其语法格式如下:参数说明如下表所示。类的定义类的定义举例如下图所示。类的定义类在定义时可以为其添加说明文档,说明文档放在字符串中,通常位于类内部、所有代码的最前面,可以通过内置的help()函数或__doc__属性获取说明文档的内容(和函数的说明文档类似),如右图所示。类的实例化类定义好之后,相当于有了一个模板,但没有对象。对象的生成是通过类的实例化实现的,类的实例化语法如下:其中ClassName为类名,parameterlist为参数列表,类实例化时ClassName是必须指定的,是否有parameterlist要结合__init__()方法中的参数情况。创建__init__()方法__init__()方法类似于Java语言中的构造方法,在类实例化时会自动调用。__init__()方法必须包含一个self参数,且必须是第一个参数,如果没有指定self参数的话,实例化时会报错,如图5-2所示。创建__init__()方法self参数是一个指向实例本身的引用,用于访问类中的属性和方法。当__init__()方法中只有一个self参数时,实例化时不需要指定参数,因为调用__init__()方法时会自动传递self参数,如图5-3所示。创建__init__()方法在__init__()方法中,除了可以指定self参数,还可以自定义一些其它参数,举例如【代码5-2】所示。创建__init__()方法【代码5-2】的运行结果如图5-4所示。类的属性属性是在类中定义的变量,有时也称为特征,即类中客观存在的静态部分。根据属性定义的位置不同,可分为类属性和实例属性。类属性与实例属性类属性是在类中方法之外定义的属性,实例属性是定义在类的方法中的属性,类属性可以在类的所有实例之间共享值,实例属性只作用于当前实例中。在右图中,类中方法外定义的属性grade为类属性,__init__()方法中定义的属性name、sex和age为实例属性。类属性与实例属性类属性可以通过类名或对象(实例)名访问,类属性需通过类名来修改,类属性修改后会作用于该类的所有实例中,如右图所示。类属性与实例属性实例属性只能通过对象名访问,使用类名访问会报错,如下图所示。类属性与实例属性·实例属性可以通过对象名修改,修改一个对象的实例属性并不影响其它对象中的实例属性,如下图所示。属性的访问权限类的属性根据外部对其访问的权限,分为共有属性、保护属性和私有属性,总结如下表所示。属性的访问权限接下来我们定义一个Person类来举例说明,如右图所示。属性的访问权限在上页代码中,name是公有属性,age是保护属性,可以直接通过对象名访问,如右图所示。属性的访问权限height和weight是私有属性,需通过“实例名._类名__XX”方式访问,直接通过对象名访问会报错,如下图所示。属性的访问权限在实际开发过程中,为了避免客户端直接对属性进行修改,我们一般将属性设置为私有,然后通过set方法设置值,通过get方法获取值,如右图所示。类的方法在5.2.1中,我们接触过类的方法,即__init__()方法。这个方法用来初始化一个对象,在实例化时自动执行,如果一个类中没有提供__init__()方法,Python将提供一个默认的__init__()方法。实例方法init__()方法在类内部有特殊的功能,属于特殊方法,除此之外,我们也可以在类中自定义其它的方法,该方法是一种在类的实例上操作的函数,所以叫做实例方法。实例方法的第一个参数必须是self,其语法格式如下:实例方法其中functionName为方法名,一般使用小驼峰法命名,self用来表示类的实例,parameterlist用于指定self以外的其它参数,block是用于实现具体功能的方法体。关于实例方法的使用举例如右图所示。实例方法实例方法的访问权限实例方法的访问权限与类属性的访问权限类似,可分为公有方法、保护方法和私有方法。实例方法的访问权限总结如下图所示。实例方法的访问权限接下来我们改造之前的Person类,分别定义公有方法、保护方法和私有方法,如右图所示。实例方法的访问权限类的实例化之后,公有方法可以直接访问,如下图所示。实例方法的访问权限保护方法通过单下划线访问,如右图所示。私有方法不能在类外部访问,不然会报错,如右图所示。实例方法的访问权限在公有方法judge_BMI()中使用代码“BMI=self.__get_BMI2()”访问了私有方法,调用judge_BMI()方法的运行结果如下图所示。类方法类方法使用装饰器“@classmethod”修饰,类方法的第一个参数必须是当前类对象(一般约定为“cls”),通过这个参数来传递类的属性和方法,类和实例对象都可以调用类方法。类方法的使用举例如右图所示。类方法运行结果如下图所示。类方法需要注意的是类方法中一定要有cls参数,如果不提供参数的话会报错,如右图所示。静态方法(2)静态方法静态方法使用装饰器“@staticmethod”修饰,静态方法与普通方法类似,不需要有self参数和cls参数,一个类中的所有实例共享静态方法,类和实例对象都可以调用静态方法。我们将上页代码中的类方法修改成静态方法,如右图所示。静态方法运行结果如下图所示。03类的继承与组合继承是实现代码重用的重要手段,当要编写的类和之前已经使用过的类有很多属性和方法是相同的,且存在一定的继承关系时,即可使用继承这种方式来达到代码重用的目的。如之前使用过的Person类和Student类,Student类就可以继承自Person类。父类与子类学习继承需先了解父类和子类概念。在Python中,Object类是所有类的父类。继承特性源于生活,如每个人从人类祖先继承说话、走路等行为,从父辈继承相貌、身高等特征,同时每个人也有独特的特征和行为。在Python中,父类和子类的关系可总结如下:子类继承父类的属性和方法。子类可以在父类的基础上额外添加属性和方法。子类可以重写父类的方法。一个子类可以有多个父类,即多重继承。继承的语法Python中继承的语法格式如下:参数说明如下图所示。继承的语法接下来我们定义一个Animal类做为父类,Dog类和Cat类分别继承Animal类,如右图所示。继承的语法运行结果如下图所示。方法重写子类会继承父类的方法,当父类中的某个方法不适用于子类时,子类可以对其进行重写。需要注意的是当子类重写父类的__init__方法时,如果需要父类的构造方法时需使用super关键字显式地调用,如果子类不重写__init__方法,实例化子类时,会自动调用父类定义的__init__方法。方法重写右图中,子类Dog没有重写父类的__init__方法,实例化时自动调用了父类的__init__方法。当子类重写了__init__方法,但是不需要父类的构造方法时,子类被实例化时直接调用子类重写后的__init__方法,如右图所示。方法重写方法重写的使用举例如右图所示。方法重写方法重写运行结果如下图所示。方法重写从上页及其运行结果可总结出:

1.子类Dog重写了__init__()方法和personality()方法,重写__init__()时通过“super().init(name,shout)”显式调用父类的__init__()方法。

2.子类Cat重写了personality()方法,未重写__init__()方法,实例化时自动调用父类__init__()方法。

3.实例化对象dog和cat都调用了父类定义的info()方法和各自重写后的personality()方法,返回结果不同。类的组合代码重用除继承方式外还有类的组合,即在一个类中以另一个类的对象作为数据属性。当类之间差异显著且一个大类由多个小类组成时可使用组合。例如电脑有品牌、颜色、内存等信息,可分为基本信息、硬件、操作系统三类,计算机这个大类可看成由这些小类的对象组成,如右图所示。类的组合类的组合运行结果如右图所示。在实际开发过程中,我们可以结合业务需求,将继承、组合两种方式结合使用。案例【案例描述】马戏团,是进行马戏表演的团体组织。它起源于非常血腥残酷的古罗马角斗士斗兽场。当时有“只有面包和马戏”才能使罗马人快乐的说法。在英文里,马戏团叫做“Circus”,源自拉丁文“圆圈”的意思,指圆形露天竞技场。现代的马戏团也在圆形场地中演出,因此演变成“马戏团”的意思。马戏的主要内容是动物表演,之所以被称为“马戏”,是因为最早的表演的主角是马,以后才陆续出现其它的动物演员。【案例要求】本案例模拟马戏团运行流程,按照菜单选择查看动物基本信息(本马戏团中动物演员包括但不限于海豚、猴子、狮子等)、随机观看表演、顺序观看表演等。案例本章回顾1.【多选】关于面向对象描述正确的有()。A.面向对象(ObjectOriented)是一种编程思想,是基于面向过程的编程思想慢慢发展而来的B.面向对象是把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为C.面向对象是一种“自下而上”的设计语言,先设计组件,再完成拼装D.面向对象适用于简单系统,容易理解2.【多选】关于面向过程描述正确的有()。A.面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候依次调用就可以了B.面向过程是以过程/方法为中心来组织编程方式C.面向过程难以应对复杂系统,难以复用,不易维护、不易扩展D.面向过程更注重的是步骤与过程,不注重职责与分工综合练习3.【多选】关于类和对象的关系描述正确的有()。A.类是用来描述具有相同的属性和方法的对象的集合B.类是对象的模板,对象是类的具体实例C.实例化就是创建一个类的实例,也就是生成类的具体对象D.类是抽象的,对象是具体的4.【多选】关于面向对象程序设计的特点,描述正确的有()。A.封装是面向对象编程的核心思想B.继承是实现代码复用的重要手段C.多态指允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式D.继承可以提高代码的复用性和可维护性综合练习5.【多选】关于类属性与实例属性描述正确的有()。A.类属性是在类中方法之外定义的属性,实例属性是定义在类的方法中的属性B.类的所有实例之间不可以共享类属性的值C.类属性可以通过类名或对象(实例)名访问D.实例属性只能通过对象名访问6.【多选】关于类属性的访问权限描述正确的有()。A.没有以任何下划线开头的属性是公有属性,可在类的外部直接访问B.以单下划线“_”开头的属性是保护属性,只有其本身和子类能访问C.以双下划线“__”开头的属性是私有属性,只有该类本身可以访问,子类不能访问D.私有属性不能通过类的实例直接访问,需通过“实例名._XX”来访问综合练习7.定义类的关键字是()。A.function B.def

C.classD.define8.关于__init__()方法描述错误的是()。A.__init__()方法类似于Java语言中的构造方法,在类实例化时会自动调用B._

温馨提示

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

评论

0/150

提交评论