多重继承

继承是面向对象编程的一个重要的方式,因为通过继承,子类可以扩展父类的功能。

Animal类的层次设计,假设要实现以下4中动物:

Dog - 狗狗;

Bat - 蝙蝠;

Parrot - 鹦鹉;

Ostrich - 鸵鸟

如果按照哺乳类和鸟类来分:

如果按照“能跑”和“能飞”来归类,就应该设计出下图这样的类层次:

如果把上面的两种分类都包含进来,就得设计更多的层次:

哺乳类:能跑的哺乳类,能飞的哺乳类;

鸟类:能跑的鸟类,能飞的鸟类。

这么一来,类的层次就复杂了。正确的做法是采用多重继承。首先主要的类层次仍然是按照哺乳类和鸟类设计:

classAnimal(object):pass

#大类:

classMammal(Animal):pass

classBird(Animal):pass

#各种动物:

classDog(Mammal):pass

classBat(Mammal):pass

classParrot(Bird):pass

classOstrich(Bird):pass

现在,要给动物再加上Runnable和Flyable的功能,只需要先定义好Runnable和Flyable的类:

classRunnable(object):defrun(self):print('Running...')classFlyable(object):deffly(self):print('Flying...')

对于需要Rnnnable功能的动物,就多继承一个Runnable,例如dog:

classDog(Mammal, Runnable):pass

对于需要Flyable功能的动物,就多继承一个Flyable,例如bat:

classBat(Mammal, Flyable):pass

通过多继承,一个子类就可以同时获得多个父类的所有功能。

MixIn

在设计类的继承关系时,通常,主线都是单一继承下来,例如,Ostrich继承自Bird。但是,如果需要混入额外的功能,通过多继承就可以实现,比如让Ostrich除了继承自Bird外,再同时继承Runnable。这种设计通常称为MixIn。为了更好的看出继承关系,我们把Runnable和Flyable改为RunnableMixIn和FlyableMixIn。类似的,你还可以定义出肉食动物CarnivorousMixIn和植食动物HerbivoresMixIn,让某个动物同时拥有好几盒MixIn:

classDog(Mammal, RunnableMixIn, CarnivorousMixIn):pass

MixIn的目的就是给一个类增加多个功能,这样,在设计类的时候,优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系。

Python自带的很多库也使用了MixIn。举个例子,Python自带了TCPServer和UDPServer这两类网络服务,而同时服务多个用户就必须使用多进程或多线程模型,这两种模型由ForkingMinIn和ThreadingMixIn提供。通过组合,即可以创造合适的服务来。

比如编写一个多进程模式的TCP服务,定义如下:

classMyTCPServer(TCPServer, ForkingMixIn):pass

编写一个多线程模式的UDP服务,定义如下:

classMyUDPServer(UDPServer, ThreadingMixIn):pass

这样一来,我们不需要复杂而庞大的继承链,只要选择组合不同的类的功能,就可以快速构造出所需的子类。

总结

由于Python允许使用多重继承,因此MixIn就是一种常见的设计。

只允许单一继承的语言(如Java)不能使用MixIn的设计。

python继承编程教程_Python高级教程-多重继承相关推荐

  1. python中文编程教学_Python入门教程完整版400集(懂中文就能学会)快来带走

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  2. python继承和多态_Python 简明教程 --- 21,Python 继承与多态

    程序不是年轻的专利,但是,它属于年轻. 目录 我们已经知道封装,继承和多态 是面向对象的三大特征,面向对象语言都会提供这些机制. 1,封装 在这一节介绍类的私有属性和方法的时候,我们已经讲到过封装. ...

  3. python 神经网络编程 视频_python基础教程之达叔系列——神经网络编程基础|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ (1)二分类问题 目标:习得一个分类器,它以图片的特征向量作为输入,然后预测出结果 y 为 1 还是 0 ...

  4. python继承编程教程_Python实现通过继承覆盖方法示例

    本文实例讲述了Python实现通过继承覆盖方法.分享给大家供大家参考,具体如下: Python真是太动态了,所有的方法默认都是虚的.子类定义父类同名函数之后,父类函数被覆盖. class P(obje ...

  5. python网络编程案例_Python 网络编程_python网络编程基础_python高级编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  6. python代码入门教程_Python入门教程丨1300多行代码,让你轻松掌握基础知识点

    欢迎关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 前言 本文适合有经验的程序员尽快进入Python世界.特别地 ...

  7. python求素数因子_Python入门教程: 素数判断与素因子分解

    好了, 我们继续挑战下Python入门编程, 如何判断一个数是素数?以及如何分解一个合数? 首先回忆下:素数就是大于1且除了1和它本身之外没有其他素因子.大于1的非素数称为合数.形如F_n=2^2^n ...

  8. python元编程运用_Python 中的元编程

    就像元数据是有关数据的数据一样,元编程就是编写用于操纵程序的某些程序.人们普遍认为,元程序就是生成其他程序的某些程序,但范式更加广泛.所有旨在自我读取.分析.转换或修改的程序都是元编程的范例.例如: ...

  9. python网络编程内容_Python网络编程

    本文要写的内容也称为Python套接字编程,并简单介绍socketserver类.参考教程主要是<Python核心编程>. 首先,客户端/服务器模型,客户端向服务器发送请求,在请求合理的情 ...

最新文章

  1. Flex 弹性盒基本语法
  2. 一起学nRF51xx 17 -  lpcomp
  3. 基于Proxy思想的Android插件框架
  4. 机器学习接口和代码之 线性回归
  5. oracle存储过程季度方法,Oracle存储过程、触发器实现获取时间段内周、月、季度的具体时间...
  6. 关于vmware虚拟机硬件里没有软盘驱动器,而操作系统里还有的解决方法
  7. c#先进行uri解码_JavaScript、C# URL编码、解码总结
  8. c语言system.h头文件下载,c语言头文件大全
  9. cad快看_有石CAD自动下单排版软件,让你的CAD都比别人强!
  10. 适合初中文凭学的计算机技术,初中毕业学啥技术好 最吃香的手艺
  11. python爬b站视频_python代码福利:用requests爬取B站视频封面
  12. XSS(跨站脚本攻击)相关内容总结整理
  13. CART分类回归树算法
  14. U-boot启动流程(Linux内核)的分析(四)
  15. 【程序源代码】外卖侠源码
  16. 《启示录:打造用户喜爱的产品》第一部分 人员6 招聘产品经理
  17. 对象认知全提升,成为 JS 高手
  18. 小米杀不死的消息推送-- Android、java后端同时接入小米推送
  19. [NLP] 实例讲解 N-gram语言模型 中 Good-Turning 平滑技术
  20. CSS 如何实现羽化效果?

热门文章

  1. Python全栈最全学习之路-Python基础(七)
  2. oracle空实例连接报错01017,分享些工作中遇到的奇怪问题以及解决方案
  3. 洛谷 P2800 又上锁妖塔
  4. 2022-2028全球与中国移动集装箱租赁市场现状及未来发展趋势
  5. php 微信表情 转码和解码方法
  6. buu-[CISCN2019 总决赛 Day2 Web1]Easyweb
  7. 传统多用户MISO系统中的加权和速率WSR最大化问题,(优化AP的beamformingW)
  8. 配置CPU温度.风扇转速,硬盘温度监控
  9. 一天搞定Linux常用的基本命令!!!
  10. 如何将excel表格的.csv(逗号分隔值文件)转换成.xls文件