原标题:Mixins and Python
原文链接 🔗counter intuitive; Mixin; 多重继承
Overview
Python 支持一种简单类型的多重继承,它允许创建 Mixins。
Mixins 是一种类,用于将额外的属性和方法“混合(mix in)”到一个类中。
这允许您以组合风格创建类。
Mixins 是一个非常棒的概念,但我经常发现人们错误地使用它们会导致一些错误。
我经常看到像下面这样使用 Mixin:
class Mixin1(object):
def test(self):
print "Mixin1"
class Mixin2(object):
def test(self):
print "Mixin2"
class MyClass(BaseClass, Mixin1, Mixin2):
pass
但是,在 Python 中,类层次结构是从右到左定义的,因此在这种情况下 Mixin2 类是基类,由 Mixin1 扩展,最后由 BaseClass 扩展。
这通常很好,因为很多时候 mixin 类不会覆盖彼此或基类的方法。
但是如果你在你的 mixin 中重写了方法或属性,这可能会导致意想不到的结果,因为方法的解析优先级是从左到右。
>>> obj = MyClass()
>>> obj.test()
Mixin1
使用 mixin 的正确方法是相反的顺序:
class MyClass(Mixin2, Mixin1, BaseClass):
pass
这种类型起初看起来有悖常理(counter intuitive),因为大多数人会从左到右读取自上而下的类层次结构,
但是如果你以程序运行的思维考虑这个正在定义的类,则可以正确读取类层次结构(MyClass => Mixin2 => Mixin1 => BaseClass。
如果你以这种方式定义你的类,你将不会有很多冲突,也不会遇到太多错误。
>>> obj = MyClass()
>>> obj.test()
Mixin2