Pythonでクラスを継承する方法

2021/01/27PythonPythonの基本

記事内に広告が含まれています。

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()を使うことで可能になります。

システムトラストでは一緒に働いていただける仲間を募集中です。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ