当前位置:首页 > TAG信息列表 > 继承的规则是怎样定义的python浅析Python中的多重继承?介绍

继承的规则是怎样定义的python浅析Python中的多重继承?介绍

继承的规则是怎样定义的python 浅析Python中的多重继承?

浅析python中的多重继承?

这篇文章主要介绍了python中的多重继承,是python学习中的基本知识,代码基于python2.x版本,需要的朋友可以参考下

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

  回忆一下animal类层次的设计,假设我们要实现以下4种动物:

继承的规则是怎样定义的python 浅析Python中的多重继承?

  dog-狗狗

  bat-蝙蝠

  parrot-鹦鹉

  ostrich-鸵鸟。

  如果按照哺乳动物和鸟类归类,我们可以设计出这样的类的层次:

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

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

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

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

  这么一来,类的层次就复杂了:

  如果要再增加“宠物类”和“非宠物类”,这么搞下去,类的数量会呈指数增长,很明显这样设计是不行的。

  正确的做法是采用多重继承。首先,主要的类层次仍按照哺乳类和鸟类设计:

  ?12345678910111213141516171819202122classanimal(object):pass?#大类:classmammal(animal):pass?classbird(animal):pass?#各种动物:classdog(mammal):pass?classbat(mammal):pass?classparrot(bird):pass?classostrich(bird):pass

  现在,我们要给动物再加上runnable和flyable的功能,只需要先定义好runnable和flyable的类:

  ?1234567classrunnable(object):defrun(self):print(running...)?classflyable(object):deffly(self):print(flying...)

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

  ?12classdog(mammal,runnable):pass

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

  ?12classbat(mammal,flyable):pass

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

  mixin

  在设计类的继承关系时,通常,主线都是单一继承下来的,例如,ostrich继承自bird。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,比如,让ostrich除了继承自bird外,再同时继承runnable。这种设计通常称之为mixin。

  为了更好地看出继承关系,我们把runnable和flyable改为runnablemixin和flyablemixin。类似的,你还可以定义出肉食动物carnivorousmixin和植食动物herbivoresmixin,让某个动物同时拥有好几个mixin:

  ?12classdog(mammal,runnablemixin,carnivorousmixin):pass

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

  python自带的很多库也使用了mixin。举个例子,python自带了tcpserver和udpserver这两类网络服务,而要同时服务多个用户就必须使用多进程或多线程模型,这两种模型由forkingmixin和threadingmixin提供。通过组合,我们就可以创造出合适的服务来。

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

  ?12classmytcpserver(tcpserver,forkingmixin):pass

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

  ?12classmyudpserver(udpserver,threadingmixin):pass

  如果你打算搞一个更先进的协程模型,可以编写一个coroutinemixin:

  ?12classmytcpserver(tcpserver,coroutinemixin):pass

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

  小结

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

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

python子类继承,如果不用父类的函数和方法,应该怎么写?

子类继承父类时,如果父类有需要初始化的属性,那么必须在子类中调用父类的初始化方法,帮助父类进行初始化,否则,子类可以不调用父类的初始化方法代码示例

功能设计动物继承


嘉和号 昌博号

  • 关注微信关注微信

猜你喜欢

热门标签

苹果15录屏功能在哪里设置 文档如何删除水印 书旗小说破解版免费 excel中的数值怎么设置Excel中数值格式化的设置方法介绍 怎么把未指定的设备添加到打印机介绍 小米云相册在哪里打开 花瓣剪辑去背景 怎么收不到验证码信息 电脑开机自动打开qq音乐怎么关闭介绍 qq聊天背景特效怎么设置介绍 creo批量添加模型参数 ps如何将照片边缘渐变虚化ps怎么局部渐变虚化? outlook回复邮件怎么带签名outlook签名怎么变成永久的? 微信怎么找更多的附近人微信怎么查看附近的人?介绍 京东权益联盟卡在哪里京东权益怎么查看? python竖着输出helloworld的代码最应该学习的编程语音是哪种? windows11怎么快速切换两个桌面一加手机怎么切换ios桌面? 怎么把excel表格信息批量导入wpswps表格超链接如何同步更新数据? 华为小艺输入法好用吗 微信专属亲情卡怎么弄手机副卡怎样升请微信的?介绍 苹果手机怎么查自己家的wifi密码 苹果桌面布局怎么设置 wpsoffice与mswps有什么区别msoffice与WPS题库一样吗? 京东物流订单号在哪查询京东运单资料怎么找? 图表左右侧各有坐标轴怎么设置ppt副坐标轴怎么调出来? 网易云音乐锁屏显示怎么设置一加8Pro怎么让网易音乐在锁屏显示?介绍 表格怎么换照片背景excel表格图片有灰色底色如何消除?介绍 oppo手机怎样申请微信小号oppo手机怎么用微信号加他人微信?介绍 word页码怎么从第二页开始是1 如何清理c盘空间不影响系统

微信公众号