検索
連載

[Python入門]多重継承とmixinPython入門(2/2 ページ)

多重継承を行う際には複数のクラスからインスタンス変数を継承すると問題が発生する。それを回避する方法と、そこから生まれるmixinという考え方を紹介する。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

mixinされたクラスの挙動を変更する

 今見たのはシンプルな例だったが、クラスごとに独自の振る舞いをmixinにも取り込みたいことがあるかもしれない。つまり、mixinクラスのメソッドでは、「何らかの処理を実行する大枠を定義しておき、mixinした側のクラスでそのクラスに独自の振る舞いを実現する」という方法がある(一般に「テンプレートメソッドパターン」などと呼ばれる)。

class Util:
    def mixin_method(self):
        self.another_method()
    def another_method(self):
        raise NotImplementedError('method not implemented')

another_methodメソッドは、Utilクラスをmixinした側でオーバーライドする必要がある

 この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

UtilクラスをmixinするBar/Baz/Quxクラス

 Bar/Baz/Quxのうち、最初の2つではUtilクラスで定義されているanother_methodメソッドをオーバーライドしている。これらが実際にはmixin_methodメソッドから呼び出される。このようにすることで、クラスに固有の振る舞いをUtilクラスからmixinする機能に組み込める。Quxクラスではオーバーライドをしていない。

 では、実際の動作を見てみよう。

Copyright© Digital Advantage Corp. All Rights Reserved.

前のページへ |       
[an error occurred while processing this directive]
ページトップに戻る