Python Language
ミックスイン
サーチ…
構文
- クラスClassName(MainClass、Mixin1、Mixin2、...)は:#は、名前のClassName、メイン(第一)クラスMainClassを持つクラスを宣言するために使用され、ミックスインMixin1、Mixin2など
- class ClassName ( Mixin1 、 MainClass 、 Mixin2 、...):# 'main'クラスは最初のクラスである必要はありません。それとmixinとの間には違いはありません
備考
ミックスインをクラスに追加するのは、スーパークラスを追加するのと同じように見えます。ミックスインfooでクラスのオブジェクトは、 はFooのインスタンスとなりますisinstance(instance, Foo)
trueを返します
混入します
Mixinは、基本クラスから来ていない異なるクラスで使用できる一連のプロパティとメソッドです。オブジェクト指向プログラミング言語では、通常、異なるクラスのオブジェクトに同じ機能を与えるために継承を使用します。オブジェクトのセットに何らかの能力がある場合、その能力を両方のオブジェクトが継承する基本クラスに入れます。
たとえば、
Car
、Boat
、Plane
というクラスがあるとします。これらのクラスのすべてのオブジェクトには移動機能があるため、関数の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
もあります。 Car
とClock
は基本クラス( Machine
)を共有できます。しかし、すべての曲が曲を再生できるわけではありません。 Boat
とPlane
はできません(少なくともこの例では)。では、コードを複製せずにどのように達成できますか?あなたはmixinを使うことができます。 Pythonでは、クラスにミックスインを与えることは、これをサブクラスのリストに追加するのと同じくらい簡単です
class Foo(main_super, mixin): ...
Foo
はmain_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クラスからのものです。これにより、コードのロジックに予期しないエラーが発生する可能性があり、そのことを考慮して念頭に置く必要があります