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

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

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

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

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

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

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

控訴裁判所によって取り下げられたメタン規制の施行を遅らせるEPAの試み

控訴裁判所によって取り下げられたメタン規制の施行を遅らせるEPAの試み

ゲッティ経由の画像。スコット・プルイットは環境保護庁の長であり、二酸化炭素とメタンガスとの愛情のこもった関係を持っていますが、彼は地球温暖化を信じることに冷たい肩を与えています。

メッセージングアプリの「誰かが入力している」バブルが実際に意味するもの

メッセージングアプリの「誰かが入力している」バブルが実際に意味するもの

一連の点滅する省略記号であろうと、「誰かが入力している」という明示的な通知であろうと、入力インジケーターと呼ばれるメッセージング機能は、多くの人にとって便利なツールであり、不安の原因でもあります。しかし、それがどのように機能するかについてもっと知ることは、少なくとも私たちにストレスを引き起こす推測ゲームを制限することができます。

マット・ラウアーは、離婚の和解で数百万ドルと馬の農場を失うことに「激怒」したと伝えられています

マット・ラウアーは、離婚の和解で数百万ドルと馬の農場を失うことに「激怒」したと伝えられています

マット・ラウアーと彼の妻のアネット・ロークは結婚間近であり、離婚手続きが激化していると伝えられています。ある情報筋は、ラウアーが「和解で約5,000万ドルをフォークする予定」であり、「マットは激怒している」と語った。彼は本質的に彼の純資産の半分をアネットに手渡している。

まあ、これは厄介です:レイプ告発者はケレンウィンズロージュニアの弁護士を彼女の攻撃者として特定します

まあ、これは厄介です:レイプ告発者はケレンウィンズロージュニアの弁護士を彼女の攻撃者として特定します

2018年6月15日金曜日、カリフォルニア州ビスタでの罪状認否の際、元NFLフットボール選手のケレンウィンズロージュニア(中央)が弁護士のブライアンワトキンス(左)とハーベイスタインバーグの後ろに立っています。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language