目录

  • 11.1 面向对象的三大特征
  • 11.2 封装
  • 11.3 继承
    • 11.3.1 单一继承
    • 11.3.2 多重继承
  • 11.4 多态
  • 11.5 设计模式
    • 11.5.1 工厂模式
    • 11.5.2 适配器模式
  • 11.6 小案例
  • 本章小结

11.1 面向对象的三大特征

面向对象程序设计实际上就是对现实世界的对象进行建模操作。面向对象程序设计的特征主要可以概括为封装、继承和多态,接下来针对这3种特性进行简单介绍。

  1. 封装
    封装是面向对象程序设计的核心思想。它是指将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。例如,计算机的主机是由内存条、硬盘、风扇等部件组成,生产厂家把这些部件用一个外壳封装起来组成主机,用户在使用该主机时,无须关心其内部的组成及工作原理,如图所示。
  2. 继承
    继承是面向对象程序设计提高重用性的重要措施。它体现了特殊类与一般类之间的关系,当特殊类包含了一般类的所有属性和行为,并且特殊类还可以有自己的属性和行为时,称作特殊类继承了一般类。一般类又称为父类或基类,特殊类又称为子类或派生类。例如,已经描述了汽车模型这个类的属性和行为,如果需要描述一个小轿车类,只需让小轿车类继承汽车模型类,然后再描述小轿车类特有的属性和行为,而不必再重复描述一些在汽车模型类中已有的属性和行为,如图所示。

    3.多态
    多态是面向对象程序设计的重要特征。生活中也常存在多态,例如,学校的下课铃声响了,这时有学生去买零食、有学生去打球、有学生在聊天。不同的人对同一事件产生了不同的行为,这就是多态在日常生活中的表现。程序中的多态是指一种行为对应着多种不同的实现。例如,在一般类中说明了一种求几何图形面积的行为,这种行为不具有具体含义,因为它并没有确定具体几何图形,又定义一些特殊类,如三角形、正方形、梯形等,它们都继承自一般类。在不同的特殊类中都继承了一般类的求面积的行为,可以根据具体的不同几何图形使用求面积公式,重新定义求面积行为的不同实现,使之分别实现求三角形、正方形、梯形等面积的功能,如图所示。

    在实际编写应用程序时,开发者需要根据具体应用设计对应的类与对象,然后在此基础上综合考虑封装、继承与多态,这样编写出的程序更健壮、更易扩展。

11.2 封装

类的封装可以隐藏类的实现细节,迫使用户只能通过方法去访问数据,这样就可以增强程序的安全性。接下来演示未使用封装可能出现的问题,如例所示。

在例中,运行结果输出的成绩为-68,在程序中不会有任何问题,但在现实生活中明显是不合理的。为了避免这种不合理的情况,就需要用到封装,即不让使用者随意修改类的内部属性。
在定义类时,可以将属性定义为私有属性,这样外界就不能随意修改。Python中通过在属性名前加两个下画线来表明私有属性,如例所示。

在例中,self.name为公有属性,self.__score为私有属性。第8行试图修改私有属性的值。从程序运行结果可看出,私有属性的值并没有发生变化。
当属性设置为私有属性后,经常需要提供设置或获取属性值的两个方法供外界使用,如例所示。

此外,私有属性在类外不能直接访问,但程序在测试或调试环境中,可以通过“对象名._类名”的方式在类外访问,如例所示。

11.3 继承

在自然界中,继承这个概念非常普遍,例如:熊猫宝宝继承了熊猫爸爸和熊猫妈妈的特性,它有着圆圆的脸颊、大大的黑眼圈、胖嘟嘟的身体,人们不会把它错认为是狒狒。在程序设计中,继承是面向对象的另一大特征,它用于描述类的所属关系,多个类通过继承形成一个关系体系。

11.3.1 单一继承

单一继承是指生成的派生类只有一个基类,如学生与教师都继承自人,如图所示。

单一继承由于只有一个基类,继承关系比较简单,操作比较容易,因此使用相对较多,其语法格式如下:

上述代码表示派生类继承自基类,派生类可以使用基类的所有公有成员,也可以定义新的属性和方法,从而完成对基类的扩展。注意Python中所有的类都继承自object类,第10章中出现的类省略了object。
接下来演示如何定义单一继承,如例所示。

大家可能会有疑问,派生类的构造方法名与基类的构造方法名相同,创建派生类实例对象如何调用构造方法,接下来演示这种情形,如例所示。

如果派生类的构造函数中需要添加参数,则可以在派生类的构造方法中调用基类的构造方法,如例所示。

在例中,第10行通过super()方法调用基类的构造方法,该行也可以写成如下两行中的任意一种形式,具体如下所示:

如果派生类定义的属性和方法与基类的属性和方法同名,则派生类实例对象调用派生类中定义的属性和方法,如例所示。

另外,需特别注意,基类的私有属性和方法是不会被派生类继承的。因此,派生类不能访问基类的私有成员,如例所示。

11.3.2 多重继承

在现实生活中,在职研究生既是一名学生,又是一名职员。在职研究生同时具有学生和职员的特征,这种关系应用在面向对象程序设计上就是用多重继承来实现的,如图所示。

多重继承指派生类可以同时继承多个基类,其语法格式如下:

上述代码表示派生类继承自基类1与基类2。
接下来演示如何定义多重继承,如例所示。

在多重继承中,如果基类存在同名的方法,Python按照继承顺序从左到右在基类中搜索方法,如例所示。

如果将上例中第13行代码中Student与Staff交换位置,具体如下所示:

再次运行程序,则运行结果如图所示。

11.4 多态

Python中加法运算符可以作用于两个整数,也可以作用于字符串,具体如下所示:

上述代码中,加法运算符对于不同类型对象执行不同的操作,这就是多态。在程序中,多态是指基类的同一个方法在不同派生类对象中具有不同的表现和行为,当调用该方法时,程序会根据对象选择合适的方法,如例所示。

11.5 设计模式

设计模式描述了软件设计过程中经常碰到的问题及解决方案,它是面向对象设计经验的总结和理论化抽象。通过设计模式,开发者就可以无数次地重用已有的解决方案,无须再重复相同的工作。本节将简单介绍工厂模式与适配器模式。

11.5.1 工厂模式

工厂模式主要用来实例化有共同方法的类,它可以动态决定应该实例化哪一个类,不必事先知道每次要实例化哪一个类。例如在编写一个应用程序时,用户可能会连接各种各样的数据库,但开发者不能预知用户会使用哪个数据库,于是提供一个通用方法,里面包含了各个数据库的连接方案,用户在使用过程中,只需要传入数据库的名字并给出连接所需要的信息即可,如例所示。

11.5.2 适配器模式

适配器模式是指一种接口适配技术,实现两个不兼容接口之间的兼容,例如原程序中存在类Instrument与Person,其中Instrument实例对象可以调用play()方法,Person实例对象可以调用act()方法,新程序中增加类Computer,其实例对象可以调用execute()方法。现要求类Instrument与Person的实例对象通过execute()调用各自的方法,具体如例所示。

11.6 小案例

小伙伴在童年时都看过《猫和老鼠》,本案例实现猫捉老鼠游戏,猫与老鼠的位置用整数代替,游戏开始时,猫与老鼠的位置随机,之后老鼠移动的步数在[-2, -1, 0, 1, 2]中随机选择一个,猫移动的步数通过用户输入,当老鼠位置与猫位置相同时,游戏结束,具体实现如例所示。

import random
#动物类
class Animal(object):step = [-2,-1,0,1,2]def __init__(self,gm,point = None):self.gm = gmif point is None:self.point = random.randint(0,50)else:self.point = pointdef move(self,aStep = random.choice(step)):if 0 <= self.point + aStep <= 50:self.point += aStep
#猫类,继承自动物类
class Cat(Animal):def __init__(self,gm,point = None):super(Cat,self).__init__(gm,point)self.gm.setPoint("cat",self.point)def move(self):aStep = int(input("请输入猫移动的步数:"))super(Cat,self).move(aStep)self.gm.setPoint("cat",self.point)
#老鼠类,继承自动物类
class Mouse(Animal):def __init__(self,gm,point = None):super(Mouse,self).__init__(gm,point)self.gm.setPoint("mouse",self.point)def move(self):super(Mouse,self).move()self.gm.setPoint("mouse",self.point)
#地图类
class GameMap(object):def __init__(self):self.catPoint,self.mousePoint = None,None#设置猫或老鼠的位置def setPoint(self,obj,point):if obj == "cat":self.catPoint = pointif obj == "mouse":self.mousePoint = point#判断猫与老鼠是否相遇def catched(self):print("老鼠:",self.mousePoint,"\t猫:",self.catPoint)if self.mousePoint is not None and self.catPoint is not None and self.mousePoint == self.catPoint:return True
#测试
if __name__ == "__main__":gm = GameMap()mouse = Mouse(gm)cat = Cat(gm)while not gm.catched():mouse.move()cat.move()else:print("猫抓住老鼠,游戏结束!")

本章小结

本章主要介绍了面向对象的三大特征,包括封装、继承与多态。在掌握面向对象编程后,还需了解设计模式,它为大型应用程序编写提供了思路。学习完本章内容,应加深对面向对象程序设计的理解,并能够将该方法运用到实际开发中。

第11章 面向对象(下)相关推荐

  1. 第六章 面向对象(下)

    除前一章所介绍的关于类.对象的基本语法之外,本章将会继续介绍Java面向对象的特性.Java为8个基本类型提供了对应的包装类,通过这些包装类可以把8个基本类型的值包装成对象使用,JDK1.5提供了自动 ...

  2. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第4章 面向对象(下)

    文章目录 一.填空题 二.判断题 三.选择题 四.简答题 五.编程题 六.原题及其解析 一.填空题 1.方法,抽象类2.子类.父类.基类3.final4.Object5.参数列表."-> ...

  3. 《面向对象程序设计》第11章在线测试

    <面向对象程序设计>第11章在线测试  <面向对象程序设计>第11章在线测试 剩余时间: 59:56  答题须知:1.本卷满分20分.            2.答完题后,请一 ...

  4. 第6章 面向对象(下)

    第6章 面向对象(下) 6.1 java 8增强的包装类 6.2 处理对象 6.2.1 打印对象和toString方法 6.2.2 ==和equals方法 6.3 类成员 6.3.1 理解类成员 6. ...

  5. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  6. python封装类在当前文件中使用_name_下调用不了_学python中对于类怎么也不明白,对了是看到简明教程11章,类与变量的对象....想要通俗易懂的答案....

    代码(简明python教程第11章,感觉看懂了大半但是其中我没调用的为什么也有...谢谢!!!):#coding:utf-8#数据结构好抽象啊..#python的空格制表位,是灾难的开始啊#init制 ...

  7. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第11章-意图场模型干预下的人机共享控制

    第10章 回到目录 无 第11章-意图场模型干预下的人机共享控制 11.1 引言 11.2 问题描述 11.3 基于意图场的共享控制算法设计 11.3.1 意图场模型设计与分析 11.3.2 共享控制 ...

  8. 《疯狂Java讲义》学习笔记 第六章 面向对象(下)

    <疯狂Java讲义>学习笔记 第六章 面向对象(下) 6.1包装类 基本数据类型 包装类 byte Byte short Short int Integer long Long char ...

  9. 大物下第11章熟记内容

    前言 最近都没有好好学习,赶紧记记笔记吧. 大物上重点 大物下第9章熟记内容 大物下第10章熟记内容 大物下第11章熟记内容 大物文章汇总 教材: 物理学(第六版)下册 东南大学等七所工科院校 编 马 ...

最新文章

  1. mysql查询字段大小写结果相同,mysql大小写查询不敏感,mysql5.7查询不区分大小写解决方案。
  2. 二、python小功能记录——监听鼠标事件
  3. Java机器学习库ML之十模型选择准则AIC和BIC
  4. 《美团编程题》丢失的三个数
  5. 汇编语言重写除零中断
  6. SLAM后端优化之-核函数
  7. \r,\n,\r\n
  8. 源码阅读:SDWebImage(五)——SDWebImageFrame
  9. java反射代码,java反射
  10. CISCO 2811 路由器配置命令全集
  11. java在线电影_java在线高清
  12. 计算机断电无法启动不了系统,电脑因为强制断电导致系统无法正常启动的解决办法...
  13. html桌面天干地支,天干地支-janlen-ChinaUnix博客
  14. LeetCode,无它,唯手熟尔(二)
  15. 腾讯区块链团队首次换将,蔡弋戈将变动职务
  16. 用计算机的声音编辑工具录制一段语音信号,语音信号的频谱分析实验指导
  17. 美丽乡村可行性研究报告
  18. python高分书籍推荐_史上最全的Python书排行榜|你想知道的都在这里
  19. 为什么我charles抓包带了给锁_使用Charles抓包
  20. 学计算机的女生后来怎样了

热门文章

  1. jquery-mobile制作的手机网站
  2. 学计算机基础word题,大学计算机基础word练习题及详解答案
  3. 二、FTP原理与配置
  4. 【Python基础】字符串 正则表达式
  5. 物联网竞赛单片机应用开发-项目汇总
  6. 关于CRMEB 商城系统商业授权的那些事儿
  7. rem、em、px的区别,详细介绍rem与px的转换
  8. 根据时间戳计算具体持续时间(天 时 分 秒)
  9. 第三课 电子计算机的发展与应用 说课稿,计算机的发展与应用说课稿.doc
  10. JUC探险-15、BlockingQueue