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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。