サーチ…


構文

  • クラスClassName(MainClass、Mixin1、Mixin2、...)は:#は、名前のClassName、メイン(第一)クラスMainClassを持つクラスを宣言するために使用され、ミックスインMixin1、Mixin2など
  • class ClassNameMixin1MainClassMixin2 、...):# 'main'クラスは最初のクラスである必要はありません。それとmixinとの間には違いはありません

備考

ミックスインをクラスに追加するのは、スーパークラスを追加するのと同じように見えます。ミックスインfooでクラスのオブジェクトは、 はFooのインスタンスとなりますisinstance(instance, Foo) trueを返します

混入します

Mixinは、基本クラスから来ていない異なるクラスで使用できる一連のプロパティとメソッドです。オブジェクト指向プログラミング言語では、通常、異なるクラスのオブジェクトに同じ機能を与えるために継承を使用します。オブジェクトのセットに何らかの能力がある場合、その能力を両方のオブジェクトが継承する基本クラスに入れます。

たとえば、 CarBoatPlaneというクラスがあるとします。これらのクラスのすべてのオブジェクトには移動機能があるため、関数のtravelを取得しtravel 。このシナリオでは、すべて同じ基本的な方法で移動します。ルートを取得し、それに沿って移動します。この関数を実装するには、 Vehicleからすべてのクラスを派生させ、その共有クラスに関数を入れることができます:

class Vehicle(object):
   """A generic vehicle class."""

   def __init__(self, position):
       self.position = position

   def travel(self, destination):
       route = calculate_route(from=self.position, to=destination)
       self.move_along(route)

class Car(Vehicle):
   ...

class Boat(Vehicle):
   ...

class Plane(Vehicle):
   ...

このコードを使用すると、呼び出すことができtravel (車上car.travel("Montana")ボート( boat.travel("Hawaii")および平面( plane.travel("France")

しかし、基底クラスで利用できない機能があればどうしますか?たとえば、 Carにラジオやラジオ局でplay_song_on_stationという曲を再生する機能を使用したいとしますが、ラジオを使用できるClockもあります。 CarClockは基本クラス( Machine )を共有できます。しかし、すべての曲が曲を再生できるわけではありません。 BoatPlaneはできません(少なくともこの例では)。では、コードを複製せずにどのように達成できますか?あなたはmixinを使うことができます。 Pythonでは、クラスにミックスインを与えることは、これをサブクラスのリストに追加するのと同じくらい簡単です

class Foo(main_super, mixin): ...

Foomain_superすべてのプロパティとメソッドを継承しますが、 mixinのプロパティとメソッドも継承します。

したがって、 CarクラスとClockクラスでラジオを使用するには、最後の例からCarをオーバーライドして、次のように記述します。

class RadioUserMixin(object):
   def __init__(self):
       self.radio = Radio()

   def play_song_on_station(self, station):
       self.radio.set_station(station)
       self.radio.play_song()

class Car(Vehicle, RadioUserMixin):
   ...

class Clock(Vehicle, RadioUserMixin):
   ...

今度はcar.play_song_on_station(98.7)clock.play_song_on_station(101.3)を呼び出すことができますが、 boat.play_song_on_station(100.5)

ミックスインの重要な点は、この機能を持つ「メイン」サブクラスを共有していないにもかかわらず、それでもコードを共有する、多くの異なるオブジェクトに機能を追加できることです。ミックスインがなければ、上記の例のようなことをするのはずっと難しく、繰り返しが必要かもしれません。

ミックスインのメソッドオーバーライド

ミックスインは、追加のプロパティやメソッドをクラスにミックスするために使用される一種のクラスです。多くの場合、mixinクラスはお互いのクラスや基本クラスのメソッドをオーバーライドしないので、これは通常は問題ありません。しかし、ミックスインのメソッドやプロパティをオーバーライドすると、Pythonではクラス階層が右から左に定義されるため、予期しない結果につながる可能性があります。

たとえば、次のクラスを取る

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

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

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

class MyClass(BaseClass, Mixin1, Mixin2):
    pass

この場合、Mixin2クラスは基本クラスであり、Mixin1によって拡張され、最後にBaseClassによって拡張されます。したがって、次のコードスニペットを実行すると:

>>> x = MyClass()
>>> x.test()
Base

返される結果は、Baseクラスからのものです。これにより、コードのロジックに予期しないエラーが発生する可能性があり、そのことを考慮して念頭に置く必要があります



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