混入

在面向对象编程语言中,mixin 是一个包含其他类使用的方法的类,而不必是其他类的父类。其他类如何访问 mixin 的方法取决于语言。

它通过允许多个类使用公共功能,但没有多重继承的复杂语义,提供了多重继承的机制。当程序员想要在不同类之间共享功能时,Mixins 很有用。不是一遍又一遍地重复相同的代码,而是可以简单地将公共功能分组为 mixin,然后将其继承到需要它的每个类中。

当我们使用多个 mixins 时,mixin 的顺序非常重要。这是一个简单的例子:

class Mixin1(object):
    def test(self):
        print "Mixin1"

class Mixin2(object):
    def test(self):
        print "Mixin2"

class MyClass(Mixin1, Mixin2):
    pass

在这个例子中我们称之为 MyClasstest 方法,

>>> obj = MyClass()
>>> obj.test()
Mixin1

结果必须是 Mixin1,因为订单是从左到右。当超级类添加它时,这可能会显示意外的结果。所以逆向顺序更好,就像这样:

class MyClass(Mixin2, Mixin1):
    pass

结果将是:

>>> obj = MyClass()
>>> obj.test()
Mixin2

Mixins 可用于定义自定义插件。

Python 3.x >= 3.0

class Base(object):
    def test(self):
        print("Base.")

class PluginA(object):
    def test(self):
        super().test()
        print("Plugin A.")

class PluginB(object):
    def test(self):
        super().test()
        print("Plugin B.")

plugins = PluginA, PluginB

class PluginSystemA(PluginA, Base):
    pass

class PluginSystemB(PluginB, Base):
    pass

PluginSystemA().test()
# Base.
# Plugin A.

 PluginSystemB().test()
# Base.
# Plugin B.