Pythonでクラスを継承する方法
Pythonのベースクラス(親クラス)は継承してサブクラス(子クラス)を定義することができます。
この記事ではPythonでのクラスの継承方法、メソッドのオーバーライド(上書き)の方法などを解説します。
Pythonでのクラスの継承方法
Pythonでベースクラス(親クラス)を継承してサブクラス(子クラス)定義するにはサブクラス(子クラス)の宣言時にクラスへの引数としてベースクラス(親クラス)の名前を与えます。
class サブクラス名( ベースクラス名 ):
具体的には
#ベースクラス(親クラス) class Parent(): def __init__( self ) : print( "Parent __init__()" ) def parent_method1( self ) : print( "Called parent_method1()" ) #サブクラス(子クラス) class Child( Parent ): def __init__( self ) : print( "Child __init__()" ) cl = Child() cl.parent_method1() #ベースクラス(親クラス)のメソッドを呼び出してみる
上記の実行結果は
Child __init__() parent_method1()
となります。
ベースクラス(親クラス)のparent_method1メソッドもサブクラス(子クラス)に継承されていることが確認できます。
またPythonの通常のメソッドは第一引数にself(自分自身のインスタンスへの参照)をとります。
メソッドのオーバーライド(上書き)
Pyhtonのクラスはメソッドのオーバーライド(上書き)が可能です。
メソッドのオーバーライド(上書き)はベースクラス(親クラス)のメソッドと同じメソッド名のメソッドをサブクラス(子クラス)にも記述し、ベースクラス(親クラス)のメソッドの振舞を変えてしまう手法です。
#ベースクラス(親クラス) class Parent(): def __init__( self ) : print( "Parent __init__()" ) def printMyName( self ) : print( "I am a Parent Class." ) #サブクラス(子クラス) class Child( Parent ): def __init__( self ) : super().__init__() #親クラスのコンストラクターを呼ぶ print( "Child __init__()" ) def printMyName( self ) : print( "I am a Child Class." ) cl = Child() cl.printMyName()
上記のコードではベースクラス(親クラス)、サブクラス(子クラス)ともにprintMyNameという名前のメソッドを持っています。
(printMyNameがオーバーライド(上書き)されています。)
この場合の実行結果は
Parent __init__() Child __init__() I am a Child Class.
となりprintMyNameメソッドはサブクラス(子クラス)のprintMyNameが呼ばれています。
ただし、JavaやC++のようにオーバーロード(引数(関数に渡す値)の数とか型とかが違う、同じ名前の関数を複数個、用意すること)はできません。
#ベースクラス(親クラス) class Parent(): def __init__( self ) : print( "Parent __init__()" ) def printMyName( self ) : print( "I am a Parent Class." ) #サブクラス(子クラス) class Child( Parent ): def __init__( self ) : print( "Child __init__()" ) def printMyName( self ) : print( "I am a Child Class." ) def printMyName( self, name ) : print( "I am a {} Class.".format( name )) cl = Child() cl.printMyName( "child" ) cl.printMyName()
上記の実行結果は
Child __init__() I am a child Class. Traceback (most recent call last): File "main.py", line 23, in <module> cl.printMyName() TypeError: printMyName() missing 1 required positional argument: 'name'
となり「name」という引数ありのメソッド(同じメソッド名の一番最後に書かれたもの)のみが有効になっています。
親クラスのメソッドを呼び出すsuper()
Pythonのクラスはサブクラス(子クラス)内のメソッドでsuper()を使ってベースクラス(親クラス)のメソッドを呼び出すことができます。
#ベースクラス(親クラス) class Parent(): def __init__( self ) : print( "Parent __init__()" ) def printMyName( self ) : print( "I am a Parent Class." ) #サブクラス(子クラス) class Child( Parent ): def __init__( self ) : super().__init__() #親クラスのコンストラクターを呼ぶ print( "Child __init__()" ) def printMyName( self ) : super().printMyName() print( "I am a Child Class." ) cl = Child() cl.printMyName()
上記の実行結果は
Parent __init__() Child __init__() I am a Parent Class. I am a Child Class.
となり、サブクラス(子クラス)内のメソッドからsuper()を使ってベースクラス(親クラス)のメソッドを呼び出すことができています。
まとめ
Pythonのクラス継承はサブクラス(子クラス)の宣言時の引数にベースクラス(親クラス)名前を書くことで継承することができます。
JavaやC++のようにメソッドのオーバーライド(上書き)は可能ですがオーバーロードはできません。
クラス内の通常のメソッドには第一引数にself(自分自身のインスタンスへの参照)が渡されます。
また、ベースクラス(親クラス)のメソッドを呼び出すにはsuper()を使うことで可能になります。