Python基础-多重继承
来源:互联网 发布:仿优酷网站源码 编辑:程序博客网 时间:2024/05/17 14:26
继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能。
回忆一下Animal类层次的设计,假设我们要实现以下4种动物:
- Dog - 狗
- Bat - 蝙蝠
- Parrot - 鹦鹉
- Ostrich - 鸵鸟
如果按照哺乳动物和鸟类归类,我们可以设计出这样的类的层次:
但是如果按照“能跑”和“能飞”来归类,我们就应该设计出这样的类的层次:
如果要把上面的两种分类都包含进来,我们就得设计更多的层次:
- 哺乳类:能跑的哺乳类,能飞的哺乳类
- 鸟类:能跑的鸟类,能飞的鸟类
这么一来,类的层次就复杂了:
如果要再增加“宠物类”和“非宠物类”,这么搞下去,类的数量会呈指数增长,很明显这样设计是不行的。
正确的做法是采用多重继承。
多重继承
#动物class Animal(object): pass#可以奔跑class Runnable(object): pass#会飞class Flyable(object): pass#哺乳动物class Mammal(Animal): pass#鸟类class Bird(Animal): pass#狗 会跑并且是哺乳动物class Dog(Mammal, Runnable): pass#蝙蝠 会飞 且是哺乳动物class Bat(Mammal, Flyable): pass#鸵鸟 会跑并且是鸟类动物class Parrot(Bird, Runnable): pass#鹦鹉 会飞 且是鸟类动物class Ostrich(Bird, Flyable): pass
通过多重继承,一个子类就可以同时获得多个父类的所有功能。
MixIn
在设计类的继承关系时,通常,主线都是单一继承下来的,例如,Ostrich继承自Bird。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,比如,让Ostrich除了继承自Bird外,再同时继承Runnable。这种设计通常称之为MixIn。
为了更好地看出继承关系,我们把Runnable和Flyable改为RunnableMixIn和FlyableMixIn。类似的,你还可以定义出肉食动物CarnivorousMixIn和植食动物HerbivoresMixIn,让某个动物同时拥有好几个MixIn:
class Dog(Mammal, RunnableMixIn, CarnivorousMixIn): pass
MixIn的目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系。
Python自带的很多库也使用了MixIn。举个例子,Python自带了TCPServer和UDPServer这两类网络服务,而要同时服务多个用户就必须使用多进程或多线程模型,这两种模型由ForkingMixIn和ThreadingMixIn提供。通过组合,我们就可以创造出合适的服务来。
比如,编写一个多进程模式的TCP服务,定义如下:
class MyTCPServer(TCPServer, ForkingMixIn): pass
编写一个多线程模式的UDP服务,定义如下:
class MyUDPServer(UDPServer, ThreadingMixIn): pass
如果你打算搞一个更先进的协程模型,可以编写一个CoroutineMixIn:
class MyTCPServer(TCPServer, CoroutineMixIn): pass
这样一来,我们不需要复杂而庞大的继承链,只要选择组合不同的类的功能,就可以快速构造出所需的子类。
- Python基础-多重继承
- Python基础-MixIn设计-多重继承
- python 继承多重继承
- python支持多重继承
- Python多重继承
- python 多重继承
- Python 多重继承mro
- Python 多重继承 mro
- python学习-多重继承
- python的多重继承
- python多重继承
- Python多重继承
- python 多重继承
- python的多重继承
- python的多重继承
- python 多重继承
- python多重继承 MRO
- Python多重继承
- Manacher算法——最长回文子串
- Linux中的线程与线程的基本操作
- JavaScript对象,BOM对象,DOM对象速查手册
- Python编码转换
- Linux下安装软件的几种方法
- Python基础-多重继承
- arcgis server 连接同步 Oracle 数据库
- 迭代器Iterator
- 前端面试之两栏布局,左侧固定右侧自适应;三栏布局,左右定宽,中间自适应
- Eclipse去除js(JavaScript)验证错误
- 华为S2700&S3700&S5700&S6700 Series Switches 管理界面登陆WEB
- 商业策划广告装修设计公司类网站织梦模板
- 如何用python 循环打印出 某年里每个月的第一天和最后一天
- Java集合---ArrayList的实现原理