連載
» 2019年09月03日 05時00分 公開

Python入門:[Python入門]多重継承とmixin (2/2)

[かわさきしんじ,Deep Insider編集部]
前のページへ 1|2       

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クラスではオーバーライドをしていない。

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

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。