ミックスインとは何ですか?なぜそれらが役立つのですか?

1009
TarkaDaal 2009-02-11 08:50.

「ProgrammingPython」の中で、MarkLutzは「mixins」について言及しています。私はC / C ++ / C#のバックグラウンドを持っており、この用語を聞いたことがありません。ミックスインとは何ですか?

この例の行間を読んで(かなり長いのでリンクしました)、「適切な」サブクラス化ではなく、多重継承を使用してクラスを拡張する場合だと思います。これは正解?

新しい機能をサブクラスに入れるのではなく、なぜそれをしたいのですか?さらに言えば、なぜミックスイン/多重継承アプローチが合成を使用するよりも優れているのでしょうか?

ミックスインと多重継承の違いは何ですか?それはセマンティクスの問題ですか?

16 answers

747
Jason Baker 2009-02-14 11:15.

ミックスインは、特殊な種類の多重継承です。ミックスインが使用される主な状況は2つあります。

  1. クラスに多くのオプション機能を提供したいとします。
  2. 多くの異なるクラスで1つの特定の機能を使用したいとします。

ナンバーワンの例として、werkzeugの要求と応答システムを考えてみましょう。次のように言うことで、単純な古いリクエストオブジェクトを作成できます。

from werkzeug import BaseRequest

class Request(BaseRequest):
    pass

Acceptヘッダーのサポートを追加したい場合は、

from werkzeug import BaseRequest, AcceptMixin

class Request(AcceptMixin, BaseRequest):
    pass

Acceptヘッダー、etag、認証、およびユーザーエージェントのサポートをサポートするリクエストオブジェクトを作成したい場合は、次のようにすることができます。

from werkzeug import BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin

class Request(AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin, BaseRequest):
    pass

違いは微妙ですが、上記の例では、ミックスインクラスはそれ自体で独立するようには作られていません。より伝統的な多重継承では、AuthenticationMixin(たとえば)はおそらくもっと似Authenticatorたものになるでしょう。つまり、クラスはおそらくそれ自体で立つように設計されているでしょう。

247
Randolpho 2009-02-11 09:00.

まず、ミックスインは多重継承言語でのみ存在することに注意してください。JavaまたはC#でミックスインを実行することはできません。

基本的に、ミックスインはスタンドアロンの基本タイプであり、子クラスに制限された機能と多形共鳴を提供します。C#で考えている場合は、すでに実装されているため、実際に実装する必要のないインターフェイスを考えてください。あなたはそれを継承し、その機能から利益を得るだけです。

ミックスインは通常、範囲が狭く、拡張することを意図したものではありません。

[編集-理由について:]

あなたが尋ねたので、私は理由に取り組むべきだと思います。大きな利点は、自分で何度も何度もそれを行う必要がないことです。C#では、ミックスインが恩恵を受ける可能性のある最大の場所は、Disposalパターンからである可能性があります。IDisposableを実装するときはいつでも、ほとんどの場合同じパターンに従いたいと思うでしょうが、最終的には同じ基本コードを少し変更して書き直します。拡張可能なDisposalミックスインがあれば、余分な入力を大幅に節約できます。

[編集2-他の質問に答える]

ミックスインと多重継承の違いは何ですか?それはセマンティクスの問題ですか?

はい。ミックスインと標準の多重継承の違いは、セマンティクスの問題です。多重継承を持つクラスは、その多重継承の一部としてミックスインを利用する場合があります。

ミックスインのポイントは、継承型に影響を与えることなく、継承を介して他の型に「ミックスイン」できる型を作成すると同時に、その型にいくつかの有益な機能を提供することです。

繰り返しますが、すでに実装されているインターフェースについて考えてみてください。

私は主にミックスインをサポートしていない言語で開発しているので、個人的にミックスインを使用していません。そのため、その「ああ!」あなたのための瞬間。しかし、もう一度やり直します。考案された例を使用します-ほとんどの言語はすでに何らかの方法で機能を提供しています-しかし、うまくいけば、ミックスインがどのように作成され使用されるかを説明します。ここに行きます:

XMLとの間でシリアル化できるようにしたいタイプがあるとします。型に、型のデータ値を含むXMLフラグメントを含む文字列を返す「ToXML」メソッドと、型が文字列内のXMLフラグメントからデータ値を再構築できるようにする「FromXML」を提供する必要があります。繰り返しになりますが、これは不自然な例であるため、ファイルストリーム、または言語のランタイムライブラリのXMLWriterクラスを使用する可能性があります。重要なのは、オブジェクトをXMLにシリアル化し、XMLから新しいオブジェクトを取得することです。

この例のもう1つの重要な点は、これを一般的な方法で実行することです。シリアル化するすべての型に「ToXML」および「FromXML」メソッドを実装する必要はありません。型がこれを実行し、正しく機能することを保証する一般的な手段が必要です。コードを再利用したい。

あなたの言語がそれをサポートしているなら、あなたはあなたのためにあなたの仕事をするためにXmlSerializableミックスインを作成することができます。このタイプは、ToXMLメソッドとFromXMLメソッドを実装します。例にとって重要ではないメカニズムを使用すると、ToXMLによって返されるXMLフラグメントを構築するために混合される任意のタイプから必要なすべてのデータを収集でき、FromXMLが次の場合にそのデータを復元することもできます。と呼ばれる。

以上です。これを使用するには、XmlSerializableから継承するXMLにシリアル化する必要のあるタイプがあります。そのタイプをシリアル化または逆シリアル化する必要があるときはいつでも、ToXMLまたはFromXMLを呼び出すだけです。実際、XmlSerializableは本格的な型で多形であるため、元の型について何も知らず、たとえばXmlSerializable型の配列のみを受け入れるドキュメントシリアライザーを構築できると考えられます。

ここで、このシナリオを他の目的に使用することを想像してみてください。たとえば、それを混合するすべてのクラスがすべてのメソッド呼び出しをログに記録することを保証するミックスイン、またはそれを混合するタイプにトランザクション性を提供するミックスインを作成します。リストは継続できます。

ミックスインを、他の方法でそのタイプに影響を与えることなく、タイプに少量の機能を追加するように設計された小さな基本タイプと考えるなら、あなたは黄金です。

うまくいけば。:)

この回答は、次のような例でミックスインを説明することを目的としています。

  • 自己完結型:短い、例を理解するためにライブラリを知る必要はありません。

  • Pythonで、他の言語ではありません。

    Rubyなどの他の言語ではこの用語がはるかに一般的であるため、これらの言語の例があったことは理解できますが、これはPythonスレッドです。

また、物議を醸す質問を検討するものとします。

ミックスインを特徴づけるために多重継承が必要かどうか?

定義

Pythonのミックスインとは何かを明確に述べている「権威ある」情報源からの引用はまだ見ていません。

私はミックスインの2つの可能な定義を見てきました(それらが抽象基本クラスなどの他の同様の概念とは異なると見なされる場合)、そして人々はどちらが正しいかについて完全に同意していません。

コンセンサスは言語によって異なる場合があります。

定義1:多重継承なし

ミックスインは、クラスの一部のメソッドがクラスで定義されていないメソッドを使用するようなクラスです。

したがって、クラスはインスタンス化されることを意図したものではなく、基本クラスとして機能します。そうしないと、インスタンスに例外を発生させずに呼び出すことができないメソッドが含まれることになります。

一部のソースが追加する制約は、クラスにデータが含まれておらず、メソッドのみが含まれている可能性があることですが、なぜこれが必要なのかわかりません。ただし、実際には、多くの便利なミックスインにはデータがなく、データのない基本クラスの方が簡単に使用できます。

古典的な例は、<=とからのすべての比較演算子の実装です==

class ComparableMixin(object):
    """This class has methods which use `<=` and `==`,
    but this class does NOT implement those methods."""
    def __ne__(self, other):
        return not (self == other)
    def __lt__(self, other):
        return self <= other and (self != other)
    def __gt__(self, other):
        return not self <= other
    def __ge__(self, other):
        return self == other or self > other

class Integer(ComparableMixin):
    def __init__(self, i):
        self.i = i
    def __le__(self, other):
        return self.i <= other.i
    def __eq__(self, other):
        return self.i == other.i

assert Integer(0) <  Integer(1)
assert Integer(0) != Integer(1)
assert Integer(1) >  Integer(0)
assert Integer(1) >= Integer(1)

# It is possible to instantiate a mixin:
o = ComparableMixin()
# but one of its methods raise an exception:
#o != o 

この特定の例は、functools.total_ordering()デコレータを介して実現できた可能性がありますが、ここでのゲームは、車輪の再発明でした。

import functools

@functools.total_ordering
class Integer(object):
    def __init__(self, i):
        self.i = i
    def __le__(self, other):
        return self.i <= other.i
    def __eq__(self, other):
        return self.i == other.i

assert Integer(0) < Integer(1)
assert Integer(0) != Integer(1)
assert Integer(1) > Integer(0)
assert Integer(1) >= Integer(1)

定義2:多重継承

ミックスインは、基本クラスの一部のメソッドが定義されていないメソッドを使用するデザインパターンであり、そのメソッドは、定義1のように派生したものではなく、別の基本クラスによって実装されることを意図しています。

ミックスインクラスという用語は、そのデザインパターンで使用することを目的とした基本クラスを指します(メソッドを使用するTODO、またはメソッドを実装するTODO?)

特定のクラスがミックスインであるかどうかを判断するのは簡単ではありません。メソッドは派生クラスに実装するだけで済みます。その場合、定義1に戻ります。作成者の意図を考慮する必要があります。

このパターンは、基本クラスのさまざまな選択肢を使用して機能を再結合できるため、興味深いものです。

class HasMethod1(object):
    def method(self):
        return 1

class HasMethod2(object):
    def method(self):
        return 2

class UsesMethod10(object):
    def usesMethod(self):
        return self.method() + 10

class UsesMethod20(object):
    def usesMethod(self):
        return self.method() + 20

class C1_10(HasMethod1, UsesMethod10): pass
class C1_20(HasMethod1, UsesMethod20): pass
class C2_10(HasMethod2, UsesMethod10): pass
class C2_20(HasMethod2, UsesMethod20): pass

assert C1_10().usesMethod() == 11
assert C1_20().usesMethod() == 21
assert C2_10().usesMethod() == 12
assert C2_20().usesMethod() == 22

# Nothing prevents implementing the method
# on the base class like in Definition 1:

class C3_10(UsesMethod10):
    def method(self):
        return 3

assert C3_10().usesMethod() == 13

権威あるPythonの出現

collections.abcの公式ドキュメントでは、ドキュメントでMixinメソッドという用語が明示的に使用されています。

クラスの場合:

  • 実装 __next__
  • 単一のクラスから継承します Iterator

その後、クラスは無料で__iter__ ミックスインメソッドを取得します。

したがって、少なくともドキュメントのこの時点では、mixinは多重継承を必要とせず、定義1と一貫性があります。

もちろん、ドキュメントはさまざまな点で矛盾している可能性があり、他の重要なPythonライブラリがドキュメントで他の定義を使用している可能性があります。

このページには、長期使用してSet mixin明確にするクラスが好きなことを示唆している、SetIteratorミックスインクラスを呼び出すことができます。

他の言語で

  • Ruby:プログラミングRubyやRubyプログラミング言語などの主要な参考書で言及されているように、明らかにミックスインに多重継承は必要ありません。

  • C ++:virtual設定されるメソッド=0は純粋仮想メソッドです。

    定義1は、抽象クラス(純粋仮想メソッドを持つクラス)の定義と一致します。そのクラスはインスタンス化できません。

    定義2は仮想継承で可能です:2つの派生クラスからの多重継承

41
Hamish Downer 2013-07-06 04:26.

私はそれらを多重継承を使用する統制のとれた方法だと考えています-最終的にミックスインはミックスインと呼ばれるクラスに関する規則に従う(かもしれない)別のPythonクラスだからです。

Mixinと呼ばれるものを管理する規則についての私の理解は、Mixinは次のとおりです。

  • メソッドを追加しますが、インスタンス変数は追加しません(クラス定数はOKです)
  • object(Pythonで)からのみ継承します

このようにして、多重継承の潜在的な複雑さを制限し、(完全な多重継承と比較して)見なければならない場所を制限することにより、プログラムのフローを追跡するのをかなり簡単にします。それらはrubyモジュールに似ています。

インスタンス変数を追加したい場合(単一の継承で許可されているよりも柔軟性があります)、合成を行う傾向があります。

そうは言っても、インスタンス変数を持つXYZMixinというクラスを見たことがあります。

31
Aaron Hall 2016-03-26 05:05.

ミックスインと多重継承の違いは何ですか?それはセマンティクスの問題ですか?

ミックスインは、多重継承の限定された形式です。一部の言語では、クラスにミックスインを追加するメカニズムは、継承のメカニズムとは(構文の点で)わずかに異なります。

特にPythonのコンテキストでは、ミックスインはサブクラスに機能を提供する親クラスですが、それ自体をインスタンス化することは意図されていません。

「これは単なる多重継承であり、実際にはミックスインではない」と言われるのは、ミックスインと混同される可能性のあるクラスを実際にインスタンス化して使用できるかどうかです。つまり、これは意味論的で非常に現実的な違いです。

多重継承の例

この例は、ドキュメントから、 OrderedCounterです。

class OrderedCounter(Counter, OrderedDict):
     'Counter that remembers the order elements are first encountered'

     def __repr__(self):
         return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))

     def __reduce__(self):
         return self.__class__, (OrderedDict(self),)

モジュールのCounterとの両方をサブクラス化OrderedDictcollectionsます。

CounterOrderedDictは両方とも、インスタンス化して単独で使用することを目的としています。ただし、両方をサブクラス化することで、順序付けられ、各オブジェクトのコードを再利用するカウンターを作成できます。

これはコードを再利用するための強力な方法ですが、問題が発生する可能性もあります。オブジェクトの1つにバグがあることが判明した場合、注意せずに修正すると、サブクラスにバグが発生する可能性があります。

Mixinの例

ミックスインは通常、OrderedCounterのような協調的な多重継承が持つ可能性のある潜在的な結合の問題なしにコードを再利用する方法として宣伝されています。ミックスインを使用するときは、データと緊密に結合されていない機能を使用します。

上記の例とは異なり、ミックスインは単独で使用することを意図したものではありません。新しい機能または異なる機能を提供します。

たとえば、標準ライブラリのライブラリにはいくつかのミックスインがありsocketserverます。

これらのミックスインクラスを使用して、各タイプのサーバーのフォークバージョンとスレッドバージョンを作成できます。たとえば、ThreadingUDPServerは次のように作成されます。

class ThreadingUDPServer(ThreadingMixIn, UDPServer):
    pass

ミックスインクラスは、UDPServerで定義されたメソッドをオーバーライドするため、最初に来ます。さまざまな属性を設定すると、基盤となるサーバーメカニズムの動作も変更されます。

この場合、ミックスインメソッドはUDPServerオブジェクト定義のメソッドをオーバーライドして、同時実行を可能にします。

オーバーライドされたメソッドはであるように見え、process_request別のメソッドも提供しますprocess_request_thread。これはソースコードからのものです:

class ThreadingMixIn:
        """Mix-in class to handle each request in a new thread."""

        # Decides how threads will act upon termination of the
        # main process
        daemon_threads = False

        def process_request_thread(self, request, client_address):
            """Same as in BaseServer but as a thread.
            In addition, exception handling is done here.
            """
            try:
                self.finish_request(request, client_address)
            except Exception:
                self.handle_error(request, client_address)
            finally:
                self.shutdown_request(request)

        def process_request(self, request, client_address):
            """Start a new thread to process the request."""
            t = threading.Thread(target = self.process_request_thread,
                                 args = (request, client_address))
            t.daemon = self.daemon_threads
            t.start()

不自然な例

これは主にデモンストレーションを目的としたミックスインです。ほとんどのオブジェクトは、このreprの有用性を超えて進化します。

class SimpleInitReprMixin(object):
    """mixin, don't instantiate - useful for classes instantiable
    by keyword arguments to their __init__ method.
    """
    __slots__ = () # allow subclasses to use __slots__ to prevent __dict__
    def __repr__(self):
        kwarg_strings = []
        d = getattr(self, '__dict__', None)
        if d is not None:
            for k, v in d.items():
                kwarg_strings.append('{k}={v}'.format(k=k, v=repr(v)))
        slots = getattr(self, '__slots__', None)
        if slots is not None:
            for k in slots:
                v = getattr(self, k, None)
                kwarg_strings.append('{k}={v}'.format(k=k, v=repr(v)))
        return '{name}({kwargs})'.format(
          name=type(self).__name__,
          kwargs=', '.join(kwarg_strings)
          )

使用法は次のようになります。

class Foo(SimpleInitReprMixin): # add other mixins and/or extend another class here
    __slots__ = 'foo',
    def __init__(self, foo=None):
        self.foo = foo
        super(Foo, self).__init__()

そして使用法:

>>> f1 = Foo('bar')
>>> f2 = Foo()
>>> f1
Foo(foo='bar')
>>> f2
Foo(foo=None)
30
lakesh 2012-06-13 19:06.

Mixinsは、クラスが機能を提供するプログラミングの概念ですが、インスタンス化に使用するためのものではありません。Mixinの主な目的は、スタンドアロンの機能を提供することであり、Mixin自体に他のMixinとの継承がなく、状態を回避することが最善です。Rubyなどの言語では、直接的な言語サポートがいくつかありますが、Pythonの場合はサポートされていません。ただし、マルチクラス継承を使用して、Pythonで提供される機能を実行することはできます。

このビデオを見ました http://www.youtube.com/watch?v=v_uKI2NOLEMミックスインの基本を理解する。初心者にとって、ミックスインの基本とその仕組み、およびそれらを実装する際に直面する可能性のある問題を理解することは非常に役立ちます。

ウィキペディアはまだ最高です: http://en.wikipedia.org/wiki/Mixin

11
SilentDirge 2014-12-26 19:54.

ここには良い説明があったと思いますが、別の見方をしたいと思います。

Scalaでは、ここで説明したようにミックスインを実行できますが、非常に興味深いのは、ミックスインが実際に「融合」されて、継承する新しい種類のクラスが作成されることです。本質的に、複数のクラス/ミックスインから継承するのではなく、継承するミックスインのすべてのプロパティを備えた新しい種類のクラスを生成します。Scalaは現在多重継承がサポートされていないJVMに基づいているため(Java 8以降)、これは理にかなっています。ちなみに、このミックスインクラスタイプは、ScalaのTraitと呼ばれる特別なタイプです。

クラスが定義される方法でほのめかされます:クラスNewClassはFirstMixinをSecondMixinでThirdMixinで拡張します...

CPythonインタープリターが同じこと(mixin class-composition)を実行するかどうかはわかりませんが、驚くことはありません。また、C ++のバックグラウンドから来ているので、ミックスインと同等のABCまたは「インターフェイス」とは呼びません。これは同様の概念ですが、使用法と実装が異なります。

9
bobince 2009-02-11 09:21.

それを回避する他の方法(継承の代わりに構成、または独自のクラスへのモンキーパッチメソッドなど)を見つけることができる場合は、新しいPythonコードでのミックスインを避けることをお勧めします。努力。

古いスタイルのクラスでは、別のクラスからいくつかのメソッドを取得する方法としてミックスインを使用できます。しかし、新しいスタイルの世界では、ミックスインも含めて、すべてがから継承されobjectます。つまり、多重継承を使用すると、当然MROの問題が発生します。

Pythonで多重継承MROを機能させる方法はいくつかありますが、特にsuper()関数ですが、super()を使用してクラス階層全体を実行する必要があり、制御の流れを理解するのはかなり困難です。

9
John Fouhy 2009-02-11 11:27.

おそらく、いくつかの例が役立つでしょう。

クラスを作成していて、それを辞書のように機能させたい場合は、__ __必要なさまざまなメソッドをすべて定義できます。しかし、それは少し苦痛です。別の方法として、いくつかを定義し、(他の継承に加えて)からUserDict.DictMixincollections.DictMixinpy3kに移動)継承することができます。これは、辞書APIの残りすべてを自動的に定義する効果があります。

2番目の例:GUIツールキットwxPythonを使用すると、複数の列を持つリストコントロールを作成できます(たとえば、Windowsエクスプローラーでのファイル表示など)。デフォルトでは、これらのリストはかなり基本的なものです。ListCtrlから継承し、適切なミックスインを追加することで、列ヘッダーをクリックして特定の列でリストを並べ替える機能など、追加の機能を追加できます。

9
BCS 2009-02-18 22:00.

これはPythonの例ではありませんが、Dプログラミング言語では、この用語mixinはほとんど同じ方法で使用される構造を指すために使用されます。クラスにたくさんのものを追加します。

D(ちなみにMIは実行しません)では、これはテンプレート(構文的に認識された安全なマクロを考えてください。そうすれば近くになります)をスコープに挿入することによって行われます。これにより、クラス、構造体、関数、モジュールなどの1行のコードを、任意の数の宣言に拡張できます。

9
Tomasz Bartkowiak 2020-01-16 03:51.

以前の回答は、MixInが何であるかを非常によく定義していると思います。ただし、それらをよりよく理解するために、コード/実装の観点から、MixIn抽象クラスおよびインターフェースと比較すると役立つ場合があります。

1.抽象クラス

  • 1つ以上の抽象メソッドを含む必要があるクラス

  • 抽象クラスに 、状態(インスタンス変数)メソッドと非抽象メソッド含めることができます

2.インターフェース

  • インターフェイスには抽象メソッドのみが含まれます(非抽象メソッドや内部状態は含まれません)

3. MixIns

  • MixIn(インターフェイスなど)に内部状態(インスタンス変数)が含まれていません
  • MixInには、1つ以上の非抽象メソッド含まれています(インターフェイスとは異なり、非抽象メソッドを含めることができます)

たとえばPythonでは、上記のすべてがclassesとして定義されているため、これらは単なる規則です。しかし、両方の共通の特徴抽象クラス、インタフェースおよびミックスインは、彼らがいることであるべきではない、自分の上に存在する、すなわちインスタンス化すべきではありません。

7
bigdata2 2016-12-06 20:30.

OPは、C ++でのミックスインについて聞いたことがないと述べました。おそらく、C ++ではCuriouslyRecurring Template Pattern(CRTP)と呼ばれているためです。また、@ Ciro Santilliは、ミックスインはC ++の抽象基本クラスを介して実装されると述べました。抽象基本クラスを使用してミックスインを実装できますが、実行時の仮想テーブルルックアップのオーバーヘッドなしに、コンパイル時にテンプレートを使用して実行時の仮想関数の機能を実現できるため、やり過ぎです。

CRTPパターンについては、ここで詳しく説明します。

以下のテンプレートクラスを使用して、@ CiroSantilliの回答のPythonの例をC ++に変換しました。

    #include <iostream>
    #include <assert.h>

    template <class T>
    class ComparableMixin {
    public:
        bool operator !=(ComparableMixin &other) {
            return ~(*static_cast<T*>(this) == static_cast<T&>(other));
        }
        bool operator <(ComparableMixin &other) {
            return ((*(this) != other) && (*static_cast<T*>(this) <= static_cast<T&>(other)));
        }
        bool operator >(ComparableMixin &other) {
            return ~(*static_cast<T*>(this) <= static_cast<T&>(other));
        }
        bool operator >=(ComparableMixin &other) {
            return ((*static_cast<T*>(this) == static_cast<T&>(other)) || (*(this) > other));
        }
        protected:
            ComparableMixin() {}
    };

    class Integer: public ComparableMixin<Integer> {
    public:
     Integer(int i) {
         this->i = i;
     }
     int i;
     bool operator <=(Integer &other) {
         return (this->i <= other.i);
     }
     bool operator ==(Integer &other) {
         return (this->i == other.i);
     }
    };

int main() {

    Integer i(0) ;
    Integer j(1) ;
    //ComparableMixin<Integer> c; // this will cause compilation error because constructor is protected.
    assert (i < j );
    assert (i != j);
    assert (j >  i);
    assert (j >= i);

    return 0;
}

編集:ComparableMixinに保護されたコンストラクターを追加して、継承のみが可能でインスタンス化できないようにしました。ComparableMixinのオブジェクトが作成されたときに、保護されたコンストラクターがコンパイルエラーを引き起こす方法を示すために例を更新しました。

6
Georg Schölly 2009-02-11 09:08.

たぶん、ルビーの例が役立つでしょう:

ミックスインComparableを含めて1つの関数を定義できます。ミックス"<=>(other)"インは、これらすべての関数を提供します。

<(other)
>(other)
==(other)
<=(other)
>=(other)
between?(other)

これは<=>(other)、正しい結果を呼び出して返すことによって行われます。

"instance <=> other"リターン0の両方のオブジェクトが0よりも小さい、等しい場合場合instanceよりも大きいotherと0より大きい場合はother大きいです。

6
Akash Soti 2012-08-01 01:49.

mixinは、クラスに機能を追加する方法を提供します。つまり、目的のクラス内にモジュールを含めることで、モジュールで定義されたメソッドを操作できます。rubyは多重継承をサポートしていませんが、それを実現するための代替手段としてミックスインを提供しています。

これは、ミックスインを使用して多重継承を実現する方法を説明する例です。

module A    # you create a module
    def a1  # lets have a method 'a1' in it
    end
    def a2  # Another method 'a2'
    end
end

module B    # let's say we have another module
    def b1  # A method 'b1'
    end
    def b2  #another method b2
    end
end

class Sample    # we create a class 'Sample'
    include A   # including module 'A' in the class 'Sample' (mixin)
    include B   # including module B as well

    def S1      #class 'Sample' contains a method 's1'
    end
end

samp = Sample.new    # creating an instance object 'samp'

# we can access methods from module A and B in our class(power of mixin)

samp.a1     # accessing method 'a1' from module A
samp.a2     # accessing method 'a2' from module A
samp.b1     # accessing method 'b1' from module B
samp.b2     # accessing method 'a2' from module B
samp.s1     # accessing method 's1' inside the class Sample
6
Stuart Gathman 2013-03-13 11:22.

Python Mixinを使用して、Pythonミルターの単体テストを実装しました。通常、ミルターはMTAと通信するため、ユニットテストが困難になります。テストミックスインは、MTAと通信するメソッドをオーバーライドし、代わりにテストケースによって駆動されるシミュレートされた環境を作成します。

したがって、spfmilterのような変更されていないmilterアプリケーションと、次のようなmixinTestBaseを使用します。

class TestMilter(TestBase,spfmilter.spfMilter):
  def __init__(self):
    TestBase.__init__(self)
    spfmilter.config = spfmilter.Config()
    spfmilter.config.access_file = 'test/access.db'
    spfmilter.spfMilter.__init__(self)

次に、milterアプリケーションのテストケースでTestMilterを使用します。

def testPass(self):
  milter = TestMilter()
  rc = milter.connect('mail.example.com',ip='192.0.2.1')
  self.assertEqual(rc,Milter.CONTINUE)
  rc = milter.feedMsg('test1',sender='[email protected]')
  self.assertEqual(rc,Milter.CONTINUE)
  milter.close()

http://pymilter.cvs.sourceforge.net/viewvc/pymilter/pymilter/Milter/test.py?revision=1.6&view=markup

3
Stefan Papp 2011-03-24 00:16.

あなたはac#のバックグラウンドを持っていると読みました。したがって、良い出発点は.NETのミックスイン実装かもしれません。

あなたはでcodeplexプロジェクトをチェックしたいかもしれません http://remix.codeplex.com/

概要については、lang.netシンポジウムのリンクをご覧ください。codeplexページのドキュメントにはまだまだあります。

ステファンよろしく

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

2021 年 6 月 8 日にニューヨーク市で開催された covid-19 パンデミックで亡くなった人々の命を偲び、祝うために、ネーミング ザ ロスト メモリアルズが主催するイベントと行進の最中に、グリーンウッド墓地の正門から記念碑がぶら下がっています。週末、ジョー・バイデン大統領は、covid-19 パンデミックの終息を宣言しました。これは、過去 2 年以上にわたり、公の場でそうするための長い列の中で最新のものです。

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

オハイオ州のエミリー・デシャネル みんな早く来て、ボーンズが帰ってきた!まあ、ショーボーンズではなく、彼女を演じた俳優. エミリー・デシャネルに最後に会ってからしばらく経ちました.Emily Deschanel は、長期にわたるプロシージャルな Bones の Temperance “Bones” Brennan としてよく知られています。

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

どうやら、ドナルド・トランプに近い人々は、今月初めにFBIによって家宅捜索された彼のMar-a-Lago財産からの映像を公開するよう彼に勧めています. 前大統領はテープを公開するかどうかを確認していませんが、息子はフォックス・ニュースにそうなるだろうと語った.

Andor は、他の Star Wars ショーから大きな距離を置きます。

Andor は、他の Star Wars ショーから大きな距離を置きます。

アンドールの一場面。数十年前、ジョージ・ルーカスがスター・ウォーズのテレビ番組を制作するのを妨げた主な理由は、お金でした。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language