Python Language
プラグインとエクステンションクラス
サーチ…
ミックスイン
オブジェクト指向プログラミング言語では、mixinは、他のクラスの親クラスでなくても、他のクラスで使用するためのメソッドを含むクラスです。他のクラスがmixinのメソッドにアクセスする方法は、言語によって異なります。
複数のクラスが共通の機能を使用できるようにすることで複数の継承のメカニズムを提供しますが、複数の継承の複雑なセマンティクスはありません。ミックスインは、プログラマが異なるクラス間で機能を共有したい場合に便利です。同じコードを何度も何度も繰り返すのではなく、共通の機能を単にミックスインにグループ化し、それを必要とする各クラスに継承することができます。
複数のミックスインを使用する場合は、ミックスインのオーダーが重要です。ここに簡単な例があります:
class Mixin1(object):
def test(self):
print "Mixin1"
class Mixin2(object):
def test(self):
print "Mixin2"
class MyClass(Mixin1, Mixin2):
pass
この例では、 MyClass
とtest
メソッドを呼び出します。
>>> 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