Pythonでクラスの継承とメソッドのオーバーライドの概念を学ぶためにプログラムを実装してみます。
■今回の環境(Python)
今回のPythonは、バージョン3.9.16を用いる。(なお、Google Colaboratory(Google Colab)を使用。)
■基底クラスと派生クラスの定義
では、早速Pythonでクラスの継承とメソッドのオーバーライドの概念を学ぶために、コードを書いていきます。
■コード
class Animal: def __init__(self, name): self.name = name def eat(self): print("動物は食べる") def sleep(self): print("動物は眠る") class Dog(Animal): def bark(self): print("ワンワン!") def eat(self): print("犬は夢中で食べている") animal = Animal("一般的な動物") animal.eat() animal.sleep() dog = Dog("太郎") dog.eat() dog.sleep() dog.bark()
今回はAnimalというオブジェクトを作成するためのテンプレート(設計図)であるクラス(基底クラス)を定義します。このクラスは、定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとして「name」を設定します。なお、最初の「self(自己)」という引数,パラメータを介して「name」というクラスのインスタンス変数が初期化されます。この時にself(自己)に対してドット演算子( . )を用いて「sound」を指定します。
次にdef文を用いてeatというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、print()を用いて日本語の文字列を出力するという処理になります。
次にdef文を用いてsleepというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、print()を用いてeatメソッド内で記述したものとは別の日本語の文字列を出力するという処理になります。
次にDogというオブジェクトを作成するためのテンプレート(設計図)であるクラス(派生クラス)を定義します。括弧内には引数,パラメータとしてAnimalを渡します。これでAnimalが継承されます。クラスを定義後、クラス内にdef文を用いてbarkというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、print()を用いて日本語の文字列(”ワンワン!”)を出力するという処理になります。
次にdef文を用いてeatというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、print()を用いて日本語の文字列を出力する(Animalクラスのeatメソッド内で記述したものとは異なる文字列)という処理になります。
その後、animalという変数を定義し、その中でAnimal()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてnameに渡す値(今回は”一般的な動物”)を渡します。渡した後に作成したオブジェクトであるanimalに対して(.)ドット演算子を用いてeat()、sleep()を呼び出します。
次にdogという変数を定義し、その中でDog()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてnameに渡す値(今回は”太郎”)を渡します。渡した後に作成したオブジェクトであるanimalに対して(.)ドット演算子を用いてeat()、sleep()、bark()を呼び出します。
■実行・検証
このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。
実行してみると、基底クラスと派生クラスを定義し、クラスの継承とメソッドのオーバーライドを行い、その後、基底クラスと派生クラスのインスタンス化を行い、クラス内のメソッドを呼び出して結果を出力させることができました。
コメント