关于Python的Mixin模式

转自:http://www.bjhee.com/python-mixin.html

像C或C++这类语言都支持多重继承,一个子类能够有多个父类,这样的设计常被人诟病。由于继承应该是个”is-a”关系。好比轿车类继承交通工具类,由于轿车是一个(“is-a”)交通工具。一个物品不多是多种不一样的东西,所以就不该该存在多重继承。不过有没有这种状况,一个类的确是须要继承多个类呢?

答案是有,咱们仍是拿交通工具来举例子,民航飞机是一种交通工具,对于土豪们来讲直升机也是一种交通工具。对于这两种交通工具,它们都有一个功能是飞行,可是轿车没有。因此,咱们不可能将飞行功能写在交通工具这个父类中。可是若是民航飞机和直升机都各自写本身的飞行方法,又违背了代码尽量重用的原则(若是之后飞行工具愈来愈多,那会出现许多重复代码)。怎么办,那就只好让这两种飞机同时继承交通工具以及飞行器两个父类,这样就出现了多重继承。这时又违背了继承必须是”is-a”关系。这个难题该怎么破?html

不一样的语言给出了不一样的方法,让咱们先来看下Java。Java提供了接口interface功能,来实现多重继承:python

如今咱们的飞机同时具备了交通工具及飞行器两种属性,并且咱们不须要重写飞行器中的飞行方法,同时咱们没有破坏单一继承的原则。飞机就是一种交通工具,可飞行的能力是是飞机的属性,经过继承接口来获取。eclipse

回到主题,Python语言可没有接口功能,可是它能够多重继承。那Python是否是就该用多重继承来实现呢?是,也不是。说是,由于从语法上看,的确是经过多重继承实现的。说不是,由于它的继承依然遵照”is-a”关系,从含义上看依然遵循单继承的原则。这个怎么理解呢?咱们仍是看例子吧。工具

能够看到,上面的Airplane类实现了多继承,不过它继承的第二个类咱们起名为PlaneMixin,而不是Plane,这个并不影响功能,可是会告诉后来读代码的人,这个类是一个Mixin类。因此从含义上理解,Airplane只是一个Vehicle,不是一个Plane。这个Mixin,表示混入(mix-in),它告诉别人,这个类是做为功能添加到子类中,而不是做为父类,它的做用同Java中的接口。spa

使用Mixin类实现多重继承要很是当心设计

  • 首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等
  • 其次它必须责任单一,若是有多个功能,那就写多个Mixin类
  • 而后,它不依赖于子类的实现
  • 最后,子类即使没有继承这个Mixin类,也照样能够工做,就是缺乏了某个功能。(好比飞机照样能够载客,就是不能飞了^_^)

另外提一下,ReactJS也有Mixin功能,并且语法很简洁:code

相关文章
相关标签/搜索