简谈python中的mixin混合类

4 篇文章 0 订阅
1 篇文章 0 订阅

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混合类的体会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值