Pythonで基底クラスにあるメソッドが派生クラスで必ず実装されることを確認してみます。
■今回の環境(Python)
今回のPythonは、バージョン3.9.16を用いる。(なお、Google Colaboratory(Google Colab)を使用。)
■基底クラスと派生クラスの定義
では、早速基底クラスにあるメソッドが派生クラスで必ず実装されることを確認するために、コードを書いていきます。
■コード
class Animal: def __init__(self, name): self.name = name def speak(self): raise NotImplementedError("Subclasses must implement the speak method.") class Cat(Animal): def speak(self): return "Meow!" class Dog(Animal): def speak(self): return "Woof!" class Cow(Animal): pass animals = [Cat("チェシャ猫"), Dog("秋田犬"), Cow("土佐牛")] for animal in animals: print(f"{animal.name} says: {animal.speak()}")
今回はAnimalというオブジェクトを作成するためのテンプレート(設計図)であるクラス(親クラス )を定義します。このクラスは、定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとしてnameを設定します。なお、最初の「self(自己)」という引数,パラメータを介して「name」というクラスのインスタンス変数が初期化されます。この時にself(自己)に対してドット演算子( . )を用いて「name」を指定します。
次にdef文を用いてspeakというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、「raise NotImplementedError」というPythonの組み込み関数を用いて、指定した例外を発生させる処理となります。
次にCatというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。括弧内には引数,パラメータとしてAnimalを渡します。これでAnimalが継承されます。クラスを定義後、クラス内にdef文を用いてspeakというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、returnとして英語の文字列を返すという処理になります。
次にDogというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。括弧内には引数,パラメータとしてAnimalを渡します。これでAnimalが継承されます。クラスを定義後、クラス内にdef文を用いてspeakというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、returnとして英語の文字列を返すという処理になります。
次にCowというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。括弧内には引数,パラメータとしてAnimalを渡します。これでAnimalが継承されます。クラスを定義後、クラス内にdef文を用いてspeakというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、pass文を用いてspeakメソッドの実装が省略するという処理になります。
クラスを定義後、”[ ]”(角括弧)を用いてanimalsというリストを定義します。リスト内にはCat()、Dog()、Cow()を記述します。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。作成されたそれぞれのオブジェクトの括弧内には引数,パラメータとしてnameに渡す要素を渡します。
最後にfor文を用いてanimals内の要素を1ずつ順番にanimal変数に格納しprint()でanimal.name、animal.speak()でクラス内の情報やメソッドを呼び出し処理結果を繰り返し出力します。なお、f文字列(f-strings)を用いてPythonの文字列内で変数や式を埋め込みます。
■実行・検証
このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。
チェシャ猫 says: Meow! 秋田犬 says: Woof! --------------------------------------------------------------------------- NotImplementedError Traceback (most recent call last) in () 20 21 for animal in animals: ---> 22 print(f"{animal.name} says: {animal.speak()}") in speak(self) 4 5 def speak(self): ----> 6 raise NotImplementedError("Subclasses must implement the speak method.") 7 8 class Cat(Animal): NotImplementedError: Subclasses must implement the speak method.
実行してみるとCatクラスとDogクラスでは正常に動作しそれぞれの名前(name)と音声(speak)が表示されましたが、Cowクラスではpass文を用いたため、speakメソッドの実装がなく、NotImplementedError が発生することを確認できました。
コメント