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

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肚子胀反胃想吐怎么办 脸上干皮特别多怎么办 月光足还不了款怎么办 孩子不爱和小朋友玩怎么办 不知道怀孕抽烟了怎么办 校园欺凌来了该怎么办 拉的屎是绿色的怎么办 生完孩子痔疮痛怎么办 生过孩子脱肛该怎么办 生完宝宝有痔疮怎么办 毎次大便都脱肛怎么办 怀孕快生了便秘怎么办 35周孕晚期便秘怎么办 怀孕了老公出轨了怎么办 婆婆跟老公睡了怎么办 婆婆和老公互黏怎么办 15岁就掉头发怎么办 24岁经常掉头发怎么办 舍友打游戏太吵怎么办 家里的地砖想换怎么办 墙上的瓷砖掉了怎么办 瓷砖掉了一块瓷怎么办 白色裙子太透了怎么办 剑三石头插错了怎么办 四六级证书丢了怎么办 当月发票冲红了怎么办 当月发票红冲了怎么办 作废的发票扔了怎么办 发票公章盖错了怎么办 发票章盖的模糊怎么办 下的电影没字幕怎么办 荣耀8下载东西慢怎么办 考科目二下大雨怎么办 不求上进的人怎么办 连锁经营投的钱怎么办 古曼丽不想养了怎么办 百度云上传太慢怎么办 手机视频拍倒了怎么办 老师收手机不给怎么办 云盘视频被和谐怎么办 我喜欢上两个人怎么办