サーチ…


ミックスイン

オブジェクト指向プログラミング言語では、mixinは、他のクラスの親クラスでなくても、他のクラスで使用するためのメソッドを含むクラスです。他のクラスが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

Orderが右から左にあるため、結果はMixin1でなければなりません。これにより、スーパークラスが追加されたときに予期しない結果が発生する可能性があります。逆順は次のようにもっと良いです:

class MyClass(Mixin2, Mixin1):
    pass

結果は次のようになります。

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

ミックスインは、カスタムプラグインを定義するために使用できます。

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.

カスタマイズされたクラスを持つプラグイン

Python 3.6では、 PEP 487__init_subclass__特殊メソッドが追加されました。これは、 メタクラスを使用せずにクラスのカスタマイズを単純化し、拡張します 。その結果、この機能により簡単なプラグインを作成することができます 。ここでは、 前の例を変更してこの機能を示します

Python 3.x 3.6
class Base:
    plugins = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.plugins.append(cls)
    
    def test(self):
        print("Base.")

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

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

結果:

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

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

Base.plugins
# [__main__.PluginA, __main__.PluginB]


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow