Pythonでクラスを多重継承する方法
Pythonではクラスの多重継承がサポートされています。
クラスの多重継承は1つのサブクラス(子クラス)が複数のベースクラス(親クラス)を継承する方法です。
Pythonでのクラスの多重継承
Pythonでクラスを多重継承(複数のベースクラス(親クラス)を継承)するにはサブクラス(子クラス)の宣言の引数に継承するベースクラス(親クラス)名をカンマで区切って列挙します。
下記では、ベースクラス(親クラス)ParentClassA , ParentClassB 両方を継承するサブクラス(子クラス)Childを定義しています。
class ParentClassA : def methodA( self ) : print( "ParentClassA:methodA()" ) class ParentClassB : def methodB( self ) : print( "ParentClassB:methodB()" ) class Child(ParentClassA , ParentClassB ): pass cl = Child() cl.methodA() # ParentClassA のメソッドmethodAを呼出す cl.methodB() # ParentClassB のメソッドmethodBを呼出す
上記の実行結果は
ParentClassA:methodA() ParentClassB:methodB()
となりサブクラス(子クラス)Childはベースクラス(親クラス)ParentClassA , ParentClassB両方のメソッドを継承していることがわかります。
同一名のメソッドがベースクラス(親クラス)に存在する場合
複数のベースクラス(親クラス)を継承した場合、同じメソッド名が複数定義されている可能性があります。
例えば
class ParentClassA : def methodC( self ) : print( "ParentClassA:methodC()" ) class ParentClassB : def methodC( self ) : print( "ParentClassB:methodC()" ) class Child1( ParentClassA, ParentClassB ): pass
のようなケース。
こんな時はどちらのメソッドが呼ばれるのでしょうか?
実験してみます。
class ParentClassA : def methodC( self ) : print( "ParentClassA:methodC()" ) class ParentClassB : def methodC( self ) : print( "ParentClassB:methodC()" ) class Child1( ParentClassA, ParentClassB ): pass class Child2( ParentClassB, ParentClassA ): pass cl1 = Child1() cl1.methodC() # メソッドmethodCを呼出すとParentClassB のものが呼ばれる cl2 = Child2() cl2.methodC() # メソッドmethodCを呼出すとParentClassB のものが呼ばれる
として、
- Child1はParentClassA, ParentClassBの順番
- Child2はParentClassB, ParentClassAの順番
でベースクラス(親クラス)を継承した場合の動作は
ParentClassA:methodC() ParentClassB:methodC()
となり、継承時に先に書いた方のメソッドがコールされています。
実際のプログラミングではこのようなことが起こらないように注意してコーディングしましょう。
まとめ
Pythonではクラスの多重継承がサポートされており、サブクラス(子クラス)の宣言の引数に継承するベースクラス(親クラス)名をカンマで区切って列挙します。
リンク