Pythonのオーバーライド メソッド(overriding method),関数

スポンサーリンク

Pythonのオーバーライド メソッド(overriding method),関数について解説しています。

オーバーライド メソッド(overriding method),関数は、子クラス(サブクラス、または派生クラスとも呼ばれる別のクラスから継承するクラス)が、親クラス (継承元となるクラス、またスーパークラスと呼ばれるクラス)の 1つによって既に提供されているメソッド(クラス属性として格納される関数)の特定の実装を提供できる機能です。

なお、メソッドのオーバーライド後に、親クラスのメソッドを呼び出すには、一般的に2つの方法があります。

■Python

今回は、Google Colaboratoryを用います。Google ColaboratoryのPythonのバージョンは、公開時点では「3.7.13」となっています。

■クラスネーム(Classname)を使用する

まずは、クラスネーム(Classname)を使用し、メソッド(クラス属性として格納される関数)のオーバーライド後に、親クラスのメソッドを実際に呼び出してみます。

■コード

class Parent: #親クラス

  def show(self):
    print("親クラスです")

class Child(Parent): #子クラス

  def display(self):
      Parent.show(self) #Parentという親クラスを呼び出す
      print("子クラスです")

object_test = Child()
object_test.display()

今回はまずオブジェクトを作成するためのテンプレート(設計図)であるクラスでParentという親クラスを定義する。定義後、def文を用いて、showというメソッド(関数)を定義します。さらに括弧内には、特別な引数,パラメーターであり、オブジェクト自体を参照するために、self(自己)を記述します。記述後、このメソッド(関数)が呼び出された時に実行される処理を記述します。処理としてはprint()で日本語の文字列を出力させるというものです。

親クラスを定義後、次にテンプレート(設計図)であるクラスでChildという子クラスを定義します。括弧内には、プロパティを継承させるために、Parent(親クラス)を引数,パラメータとして渡します。その後、displayというメソッド(関数)を定義し、括弧内には、特別な引数,パラメーターであり、オブジェクト自体を参照するために、self(自己)を記述します。記述後、このメソッド(関数)が呼び出された時に実行される処理を記述します。

処理としては親クラスで既に提供されているshowというメソッド(関数)を呼び出すために、「Parent」というクラスネーム(Classname)を記述し、さらにドット(.)演算子を用いて、提供されているshowというメソッド(関数)を記述します。なお、括弧内にはオブジェクト自体を参照するために、self(自己)という引数,パラメータを記述します。さらに、親クラスで提供されているshowというメソッド(関数)を呼び出すのとは、別にprint()を用いて日本語の文字列を出力させるという処理になります。

子クラスを定義後、object_testという変数を定義し、その中に「Child()」を格納します。これでオブジェクトを作成するためのプロセスである「インスタンス化」が行われました。

インスタンス化を行った後に、オブジェクトに対してドット(.)演算子を用いて、子クラスのdisplay()を呼び出してみます。

■検証・実行

コードを記述後、セルを保存し、Google Colaboratory上でセルを実行してみます。

実行してみると、クラスネーム(Classname)を使用し、親のクラスで提供されているメソッド(関数)を呼び出すことができました。

■Super()を使用する

次にSuper()を使用し、メソッド(クラス属性として格納される関数)のオーバーライド後に、親クラスのメソッドを実際に呼び出してみます。

■コード

class Parent: #親クラス

  def show(self):
    print("親クラスです")

class Child(Parent): #子クラス

  def display(self):
      super().show() #Parentという親クラスを呼び出す
      print("子クラスです")

object_test = Child()
object_test.display()

コード自体は、先程のクラスネーム(Classname)を使用し、メソッド(クラス属性として格納される関数)のオーバーライド後に、親クラスのメソッドを呼び出した時とほとんど変化はありませんが、親クラスを定義後に、テンプレート(設計図)であるクラスでChildという子クラスを定義し、displayというメソッド(関数)を定義する際に、メソッド(関数)を呼び出し実行される処理として、super()を用います。用いる場合は、ドット(.)演算子を用いて親クラスで提供されているshowというメソッド(関数)を記述します。これで親クラスで提供されているメソッド(関数)を呼び出すことができます。super()は、親クラスを明示的に参照する機能を持っています。なお、親クラスを明示的に参照する機能を持っていますので、showというメソッド(関数)を記述する際に、括弧内にオブジェクト自体を参照するために、self(自己)という引数,パラメータを記述しなくてもよい。記述すると、「TypeError: show() takes 1 positional argument but 2 were given(show() は 1 つの位置引数を取りますが、2つが指定されました)」というエラーが出力される。

子クラスを定義後、object_testという変数を定義し、その中に「Child()」を格納します。これでオブジェクトを作成するためのプロセスである「インスタンス化」が行われました。

インスタンス化を行った後に、オブジェクトに対してドット(.)演算子を用いて、内部のdisplay()を呼び出してみます。

■検証・実行

コードを記述後、セルを保存し、Google Colaboratory上でセルを実行してみます。

実行してみると、Super()を使用し、子クラスから、親クラスで提供されているメソッド(関数)を呼び出すことができました。

コメント

タイトルとURLをコピーしました