[Python入門]多重継承とmixin:Python入門(2/2 ページ)
多重継承を行う際には複数のクラスからインスタンス変数を継承すると問題が発生する。それを回避する方法と、そこから生まれるmixinという考え方を紹介する。
mixinされたクラスの挙動を変更する
今見たのはシンプルな例だったが、クラスごとに独自の振る舞いをmixinにも取り込みたいことがあるかもしれない。つまり、mixinクラスのメソッドでは、「何らかの処理を実行する大枠を定義しておき、mixinした側のクラスでそのクラスに独自の振る舞いを実現する」という方法がある(一般に「テンプレートメソッドパターン」などと呼ばれる)。
class Util:
def mixin_method(self):
self.another_method()
def another_method(self):
raise NotImplementedError('method not implemented')
このUtilクラスでは2つのメソッドが定義されている。mixin_methodメソッドは、another_methodメソッドを呼び出すだけだ。そして、another_methodメソッドではエラー(NotImplementedError例外)を発生させるだけだ。エラーとするだけの関数を定義しているのは、mixin_methodメソッドからはanother_methodメソッドを呼び出すが、それはUtilクラスをmixinした側でオーバーライドする必要があることを伝えるためだ。
では、これを幾つかのクラスでmixinしてみよう。
class Foo:
pass
class Bar(Foo, Util):
def __init__(self):
self.x = 'BAR'
def another_method(self):
print('Hello from', self.x)
class Baz(Foo, Util):
def __init__(self):
self.y = 'BAZ'
def another_method(self):
print('Hello from', self.y)
class Qux(Foo, Util):
pass
Bar/Baz/Quxのうち、最初の2つではUtilクラスで定義されているanother_methodメソッドをオーバーライドしている。これらが実際にはmixin_methodメソッドから呼び出される。このようにすることで、クラスに固有の振る舞いをUtilクラスからmixinする機能に組み込める。Quxクラスではオーバーライドをしていない。
では、実際の動作を見てみよう。
Copyright© Digital Advantage Corp. All Rights Reserved.