python 继承 重写,python是多继承还是单继承

  python 继承 重写,python是多继承还是单继承

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

  回想一下动物类级别的设计,假设我们要实现以下四种动物:

  狗-狗;蝙蝠-蝙蝠;鹦鹉-鹦鹉;鸵鸟-鸵鸟。如果按照哺乳动物和鸟类来分类,我们可以设计出这样一个类层次结构:

  但如果按照“能跑”和“能飞”来分类的话,我们应该设计这样一个阶级层次结构:

  如果我们想包括以上两类,我们必须设计更多的层次:

  哺乳动物:会跑的哺乳动物,会飞的哺乳动物;鸟:会跑的鸟,会飞的鸟。这样,类的层次结构就复杂了:

  如果要加上“宠物类目”和“非宠物类目”,类目数量会成倍增加,显然这种设计不可行。

  正确的做法是采用多重继承。首先,主要的职业等级仍然是按照哺乳动物和鸟类来设计的:

  动物类(物体):

  及格

  #类别:

  哺乳动物类(动物):

  及格

  类鸟(动物):

  及格

  #各种动物:

  犬类(哺乳动物):

  及格

  蝙蝠类(哺乳动物):

  及格

  类鹦鹉(鸟):

  及格

  鸵鸟类(鸟):

  Pass现在,我们要给动物添加Runnable和Flyable的函数,先定义Runnable和Flyable的类就行了:

  类Runnable(对象):

  定义运行(自身):

  打印(正在运行.)

  可飞行类(对象):

  定义飞行(自身):

  打印(飞行.)对于需要Runnable函数的动物,多继承一个Runnable,比如狗:

  犬类(哺乳动物,可奔跑):

  对于需要会飞功能的动物,多继承一个会飞的,比如蝙蝠:

  蝙蝠类(哺乳动物,可飞行):

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

  MixIn在设计类的继承关系时,通常情况下,主线是单个继承的,比如鸵鸟继承鸟。但是,如果需要“混入”额外的函数,可以通过多重继承来实现,比如让鸵鸟继承Runnable和Bird。这种设计通常被称为Mixin。

  为了更好的看到继承关系,我们把Runnable和Flyable改为RunnableMixin和FlyableMixin。同样,你也可以定义食肉性Mixin和食草性Mixin,这样一种动物可以同时有几种mixin:

  犬类(哺乳动物,奔跑混合动物,食肉混合动物):

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

  Python附带的许多库也使用Mixin。例如,Python附带了两种网络服务,TCPServer和UDPServer。要同时服务多个用户,就需要使用多进程或者多线程的模型,ForkingMixin和ThreadingMixin就是提供的。通过组合,我们可以创建合适的服务。

  例如,编写一个多进程TCP服务,其定义如下:

  类MyTCPServer(TCPServer,ForkingMixin):

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

  类MyUDPServer(UDPServer,ThreadingMixin):

  Pass,如果你打算建立一个更高级的协同学模型,你可以写一个CoroutineMixin:

  类MyTCPServer(TCPServer,CoroutineMixin):

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

  总结因为Python允许多重继承,所以Mixin是一种常见的设计。

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

  类似于多重继承(其实Mixin可以看做是多重继承在特定场景下的应用),但通常Mixin类和Mixin类本身并不是is-a关系,Mixin类混合是为了增加一些(可选的)功能。通过自由混合mixin类,您可以灵活地向混合类添加不同的功能。

  为了解决多重继承的问题,Java引入了接口技术,Lisp和Ruby引入了Mix-in技术。

  参考文献1

  2参考

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: