Pythonでクラスの継承を使って派生クラスで独自の機能を追加する

スポンサーリンク

Pythonでクラスの継承を使って派生クラスで独自の機能を追加してみます。

■今回の環境(Python)

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

■基底クラスと派生クラスの定義

Pythonでクラスの継承を使って派生クラスで独自の機能を追加するために、コードを書いていきます。

■コード

class Animal:
    def __init__(self, name, sound):
        self.name = name
        self.sound = sound

    def make_sound(self):
        print(f"{self.name} は、 {self.sound}")


class Dog(Animal):
    def __init__(self, name):
        super().__init__(name, "吠える")


class Cat(Animal):
    def __init__(self, name):
        super().__init__(name, "ミャーと鳴く")


class Bird(Animal):
    def __init__(self, name):
        super().__init__(name, "ちゅうちゅう鳴く")


dog = Dog("土佐犬")
dog.make_sound()  

cat = Cat("ミルキー")
cat.make_sound()  

bird = Bird("すずめ")
bird.make_sound()

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

次にdef文を用いてmake_soundというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとして「name」を設定します。このメソッドが呼び出された時の処理として、print()を用いて日本語の文字列とインスタンス変数(self.name、self.sound)を出力するという処理になります。なお、f文字列(f-strings)を用いてPythonの文字列内で変数や式を埋め込みます。

次にDogというオブジェクトを作成するためのテンプレート(設計図)であるクラス(派生クラス)を定義します。括弧内には引数,パラメータとしてAnimalを渡します。これでAnimalが継承されます。クラスを定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとしてそれぞれ「name」を設定します。設定後、super()を用いて基底クラス(Animal)の__init__() を呼び出します。呼び出す際に括弧内には第1の引数,パラメータとしてnameを設定し、第2の引数,パラメータとしてインスタンス変数(self.sound)に設定する値(今回は”吠える”)を渡します。これで派生クラス(Dog)がインスタンス化されたときに、基底クラス(Animal)の __init__ が呼び出され、nameとself.soundが初期化されます。これでDogクラスのインスタンスを作成すると、make_soundメソッドが呼び出されます。

次にCatというオブジェクトを作成するためのテンプレート(設計図)であるクラス(派生クラス)を定義します。括弧内には引数,パラメータとしてAnimalを渡します。これでAnimalが継承されます。クラスを定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとしてそれぞれ「name」を設定します。設定後、super()を用いて基底クラス(Animal)の__init__() を呼び出します。呼び出す際に括弧内には第1の引数,パラメータとしてnameを設定し、第2の引数,パラメータとしてインスタンス変数(self.sound)に設定する値(今回は”ミャーと鳴く”)を渡します。これで派生クラス(Cat)がインスタンス化されたときに、基底クラス(Animal)の __init__ が呼び出され、nameとself.soundが初期化されます。これでCatクラスのインスタンスを作成すると、make_soundメソッドが呼び出されます。

次にBirdというオブジェクトを作成するためのテンプレート(設計図)であるクラス(派生クラス)を定義します。括弧内には引数,パラメータとしてAnimalを渡します。これでAnimalが継承されます。クラスを定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとしてそれぞれ「name」を設定します。設定後、super()を用いて基底クラス(Animal)の__init__() を呼び出します。呼び出す際に括弧内には第1の引数,パラメータとしてnameを設定し、第2の引数,パラメータとしてインスタンス変数(self.sound)に設定する値(今回は”ちゅうちゅう鳴く”)を渡します。これで派生クラス(Bird)がインスタンス化されたときに、基底クラス(Animal)の __init__ が呼び出され、nameとself.soundが初期化されます。これでBirdクラスのインスタンスを作成すると、make_soundメソッドが呼び出されます。

その後、dogという変数を定義し、その中でDog()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてnameに渡す値(今回は”土佐犬”)を渡します。渡した後に作成したオブジェクトであるdogに対して(.)ドット演算子を用いてmake_sound()を呼び出します。次に同じようにして、catとbirdという変数を定義し、その中でそれぞれCat()とBird()を用います。この時に括弧内にそれぞれ第1の引数,パラメータとしてnameに渡す値を渡します。渡した後に作成したオブジェクト(catとbird)に対して(.)ドット演算子を用いてmake_sound()を呼び出します。

■実行・検証

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

実行してみると、基底クラスと派生クラスを定義し、派生クラスでは基底クラスの属性やメソッドを継承し、独自の機能を追加。追加後、派生クラスのインスタンス化を行い、派生クラス内のメソッドを呼び出して結果を出力させることができました。

コメント

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