mixin混合类是一种通用语言的设计模式,在python中指的就是多重继承。最近在看django2.0以上的源码时,发现主体框架都是mixin模式比较多,整体看起来非常有舒适感。因此想简单谈谈我对mixin使用的感悟。
为什么要用mixin
面向对象编程特点中的一个就是继承性,mixin是多重继承,难道是继承的时候多写了两个类就是mixin了么?
先说结论,mixin指在继承原始类的功能下,把附加的不好抽象到父类的功能,写个新类出来继承,便是mixin。举个常用栗子:
Class Bird:
def paw(self):
pass
def teeth(self):
pass
def tail(self):
pass
Class Wild(Bird):
pass
Class Hosehold(Bird):
pass
我们定义了Bird类,里面有其属性方法,又定义了继承父类的家养和野生两大类,这个就是基本的继承。此时如果我们要加一个功能,例如会飞的属性,如果加到父类中会突兀(父类都是自身具体特征,而飞是一个能力),因此我们只能继承父类后加方法:
Class FlyBird(Bird):
def flyable(self):
pass
这次问题是解决了,那下次定义一个陆生动物类,这个flyable方法还要重写,所以我们是用mixin混合类。后面写再多类,需要这个功能去继承就行。
Class FlyMixin:
pass
Class FlyBird(FlyMixin, Bird):
pass
带来的问题
问题复杂:因为是多重继承,所以功能模块有些碎片化,分布不集中,给查找和研读造成了不便。
继承顺序:mixin混合类继承,会有继承顺序的问题。对于继承顺序有要求的建议不要使用,因为mixin强调的是功能上的继承,而并非我是谁的子类。
功能覆盖:因为是多重继承,难免会有多个类同个方法名字,这个时候子类调用的时候就会出现结果异常的情况。所以使用一定要避免方法名称相同。
后面有时间再详细写下对django源码mixin混合类的体会。