Pythonで継承とポリモーフィズムを使用したクラスを定義する

スポンサーリンク

Pythonで継承とポリモーフィズムを使用したクラスを定義し、実装してみます。

■今回の環境(Python)

今回のPythonは、バージョン3.9.16を用いる。(なお、Google Colaboratory(Google Colab)を使用。)

■継承とポリモーフィズムを使用したクラスの定義

では、早速Pythonで継承とポリモーフィズムを使用したクラスを定義するために、コードを書いていきます。

■コード

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def speak(self):
        raise NotImplementedError('Subclass must implement abstract method')

class Dog(Animal):
    def speak(self):
        return 'Woof!'

class Cat(Animal):
    def speak(self):
        return 'Meow!'

def animal_speak(animal):
    print(animal.speak())

dog = Dog('Fido', 5)
cat = Cat('Mittens', 3)

animal_speak(dog)
animal_speak(cat)

今回はAnimalというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。このクラスは、定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2,第3の引数,パラメータとしてnameとageを設定します。なお、最初の「self(自己)」という引数,パラメータを介して、「name」と「age」というクラスのインスタンス変数が初期化されます。この時にself(自己)に対してドット演算子( . )を用いて「name」と「age」を指定します。

さらに、def文を用いてspeakというメソッドが定義します。このメソッドの括弧内には引数,パラメータとしてselfを設定します。これはオブジェクト自身を参照するためです。このメソッドが呼び出された時の処理として、「raise NotImplementedError()」で例外を発生させます。メソッドがサブクラスでオーバーライドされていないことを示すために使用します。

次にオブジェクトを作成するためのテンプレート(設計図)であるDogというクラスを定義します。括弧内には引数,パラメータとしてAnimalを設定します。これでAnimalというクラスを継承。そしてこのクラス内には、def文を用いてspeakという抽象メソッドが定義します。抽象メソッドとは、サブクラス(Dogというクラス)で必ず実装しなければならないメソッド。このメソッドの括弧内には引数,パラメータとしてselfを設定します。これはオブジェクト自身を参照するためです。このメソッドが呼び出された時の処理として、returnとして文字列を返します。

次に同じようにオブジェクトを作成するためのテンプレート(設計図)であるCatというクラスを定義します。括弧内には引数,パラメータとしてAnimalを設定します。これでAnimalというクラスを継承。そしてこのクラス内には、def文を用いてspeakという抽象メソッドが定義します。抽象メソッドとは、サブクラス(Dogというクラス)で必ず実装しなければならないメソッド。このメソッドの括弧内には引数,パラメータとしてselfを設定します。これはオブジェクト自身を参照するためです。このメソッドが呼び出された時の処理として、returnとしてDogというクラス内のメソッドで記述したものとは別の文字列を返します。

次にdef文でanimal_speak()メソッドが定義します。括弧内には引数,パラメータとして、Animalオブジェクトを設定します。このメソッドが呼び出された時の処理として、受け取ったAnimalオブジェクトに対して(.)ドット演算子を用いて、speak()メソッドを呼び出し、メソッドが処理された結果をreturnとして返します。

次に、dogという変数を定義し、その中でDog()を呼び出します。インスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1,第2の引数,パラメータとしてnameとageの情報を渡します。

同じくcatという変数を定義し、その中でCat()を呼び出します。インスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1,第2の引数,パラメータとしてnameとageの情報を渡します。

最後に、作成されたオブジェクトであるdogとcatを、animal_speak()を呼び出す際に引数,パラメータとしてこれらを渡します。すると、メソッドが呼び出され、処理が実行し結果が返されます。

■実行・検証

このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。

実行してみると、継承とポリモーフィズムを使用したクラスを定義。定義したクラスを実装し、結果を出力させることができました。

コメント

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