Pythonでクラスの継承を使って基底クラスの機能を派生クラスで拡張する

スポンサーリンク

Pythonでクラスの継承を使って基底クラスの機能を派生クラスで拡張してみます。

■今回の環境(Python)

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

■クラスの定義

では、早速クラスの継承を使って基底クラスの機能を派生クラスで拡張してみますので、コードを書いていきます。

■コード

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

    def eat(self):
        print(f"{self.name}は食べている")

    def sleep(self):
        print(f"{self.name}は眠っている")


class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed

    def bark(self):
        print(f"{self.name}が吠えている")


class Cat(Animal):
    def __init__(self, name, color):
        super().__init__(name)
        self.color = color

    def meow(self):
        print(f"{self.name}は「ミャー」と鳴く")


animal1 = Animal("汎用動物")
animal1.eat()  
animal1.sleep() 

dog1 = Dog("太郎", "秋田犬")
dog1.eat()  
dog1.sleep()  
dog1.bark()  

cat1 = Cat("ローレンス", "白")
cat1.eat()  
cat1.sleep()  
cat1.meow()

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

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

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

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

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

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

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

その後、animal1という変数を定義し、その中でAnimal()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてnameに渡す値(今回は”汎用動物”)を渡します。渡した後に作成したオブジェクトであるanimal1に対して(.)ドット演算子を用いてeat()、sleep() を呼び出します。

次にdog1という変数を定義し、その中でDog()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてnameに渡す値(今回は”太郎”)を渡し、第2の引数,パラメータとしてbreedに渡す値(今回は”秋田犬”)を渡します。渡した後に作成したオブジェクトであるdog1に対して(.)ドット演算子を用いてeat()、sleep()、bark()を呼び出します。

次にcat1という変数を定義し、その中でCat()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてnameに渡す値(今回は”ローレンス”)を渡し、第2の引数,パラメータとしてcolorに渡す値(今回は”白”)を渡します。渡した後に作成したオブジェクトであるcat1に対して(.)ドット演算子を用いてeat()、sleep()、meow()を呼び出します。

■実行・検証

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

実行してみると、クラスの継承を使って基底クラスの機能を派生クラスで拡張し、クラスのインスタンスを作成し、それぞれの属性やメソッドを利用して動物の情報を表示させることができました。

コメント

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