Pythonで親クラスと子クラスを使って親子関係を表現する

スポンサーリンク

Pythonで親クラスと子クラスを使って親子関係を表現し、これを実装してみます。

■今回の環境(Python)

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

■親クラスと子クラスを定義する

では、早速親クラスと子クラスを定義するために、コードを書いていきます。

■コード

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

    def greet(self):
        print(f"私の名前は {self.name}")

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

    def introduce(self):
        print(f"私の名前は {self.name} です。歳は {self.age} 歳です。")

# 親クラスのインスタンス化
parent = Parent("田中")
parent.greet()  

# 子クラスのインスタンス化
child = Child("山田", 25)
child.greet()     
child.introduce()

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

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

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

次にdef文を用いてintroduceというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、日本語と全メソッドからアクセス可能なインスタンス変数(self.nameとself.age)をreturnで返すという処理になります。

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

その後、今後はchildという変数を定義し、その中でChild()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてnameに渡す要素(今回は”山田”)を渡します。渡した後に作成したオブジェクトであるparentに対して(.)ドット演算子を用いてgreet()を呼び出します。次に第2の引数,パラメータとしてageに渡す要素(今回は25)を渡します。渡した後に作成したオブジェクトであるparentに対して(.)ドット演算子を用いてgreet()とintroduce()を呼び出します。

■実行・検証

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

実行してみると、親クラスと子クラスを定義し、親クラスと子クラス間で属性やメソッドが共有され、子クラス内では定義されていないメソッドを呼び出し、処理結果を出力させることができました。

コメント

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