基底クラスと派生クラスを定義し派生クラスで独自の属性を追加することや、メソッドをオーバーライドしてみます。
■今回の環境(Python)
今回のPythonは、バージョン3.9.16を用いる。(なお、Google Colaboratory(Google Colab)を使用。)
■基底クラスと派生クラスの定義
では、早速Pythonで基底クラスと派生クラスを定義し派生クラスで独自の属性を追加するために、コードを書いていきます。
■コード
class Book: def __init__(self, title, author): self.title = title self.author = author def display(self): print(f"タイトル: {self.title}") print(f"著者: {self.author}") class Fiction(Book): def __init__(self, title, author, genre): super().__init__(title, author) self.genre = genre def display(self): super().display() print(f"ジャンル: {self.genre}") class NonFiction(Book): def __init__(self, title, author, topic): super().__init__(title, author) self.topic = topic def display(self): super().display() print(f"トピック: {self.topic}") book1 = Book("大阪の本", "大阪太郎") book1.display() fiction1 = Fiction("SF", "SF作家", "SF") fiction1.display() nonfiction1 = NonFiction("歴史の本", "歴史家", "歴史") nonfiction1.display()
今回はBookというオブジェクトを作成するためのテンプレート(設計図)であるクラス(基底クラス)を定義します。このクラスは、定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2,第3の引数,パラメータとして「title」、「author」を設定します。なお、最初の「self(自己)」という引数,パラメータを介して「title」、「author」というクラスのインスタンス変数が初期化されます。
次にdef文を用いてdisplayというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、print()を用いてインスタンス変数(self.titleとself.author)日本語の文字列を出力するという処理になります。なお、f文字列(f-strings)を用いてPythonの文字列内で変数や式を埋め込みます。
次にFictionというオブジェクトを作成するためのテンプレート(設計図)であるクラス(派生クラス)を定義します。括弧内には引数,パラメータとしてBookを渡します。これでBookが継承されます。クラスを定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2,第3,第4の引数,パラメータとしてそれぞれ「title」、「author」、「genre」を設定します。設定後、super()を用いて基底クラス(Book)の__init__() を呼び出します。呼び出す際に括弧内にはnameを設定します。これで派生クラス(Fiction)がインスタンス化されたときに、基底クラス(Book)の __init__ が呼び出され、title、authorが初期化されます。次に最初の「self(自己)」という引数,パラメータを介して「genre」というクラスのインスタンス変数が初期化されます。この時にself(自己)に対してドット演算子( . )を用いて「genre」を指定します。
次にdef文を用いてdisplayというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。設定後、super()を用いて基底クラス(Book)のメソッドであるdisplay()を呼び出します。その後、print()を用いてインスタンス変数(self.genre)日本語の文字列を出力します。なお、f文字列(f-strings)を用いてPythonの文字列内で変数や式を埋め込みます。
次にNonFictionというオブジェクトを作成するためのテンプレート(設計図)であるクラス(派生クラス)を定義します。括弧内には引数,パラメータとしてBookを渡します。これでBookが継承されます。クラスを定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2,第3,第4の引数,パラメータとしてそれぞれ「title」、「author」、「topic」を設定します。設定後、super()を用いて基底クラス(Book)の__init__() を呼び出します。呼び出す際に括弧内にはnameを設定します。これで派生クラス(Fiction)がインスタンス化されたときに、基底クラス(Book)の __init__ が呼び出され、title、topicが初期化されます。次に最初の「self(自己)」という引数,パラメータを介して「topic」というクラスのインスタンス変数が初期化されます。この時にself(自己)に対してドット演算子( . )を用いて「topic」を指定します。
次にdef文を用いてdisplayというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。設定後、super()を用いて基底クラス(Book)のメソッドであるdisplay()を呼び出します。その後、print()を用いてインスタンス変数(self.topic)日本語の文字列を出力します。なお、f文字列(f-strings)を用いてPythonの文字列内で変数や式を埋め込みます。
その後、book1という変数を定義し、その中でBook()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてtitleに渡す値(今回は”大阪の本”)を渡します。第2の引数,パラメータとしてauthorに渡す値(今回は”大阪太郎”)を渡します。渡した後に作成したオブジェクトであるbook1に対して(.)ドット演算子を用いてdisplay()を呼び出します。
また、同じようにfiction1という変数を定義し、その中でFiction()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてtitleに渡す値(今回は”SF”)を渡します。第2の引数,パラメータとしてauthorに渡す値(今回は”SF作家”)を渡します。第3の引数,パラメータとしてgenreに渡す値(今回は”SF”)を渡します。渡した後に作成したオブジェクトであるfiction1に対して(.)ドット演算子を用いてdisplay()を呼び出します。
さらに同じようにして、nonfiction1という変数を定義し、その中でNonFiction()を用います。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。この時に括弧内に第1の引数,パラメータとしてtitleに渡す値(今回は”歴史の本”)を渡します。第2の引数,パラメータとしてauthorに渡す値(今回は”歴史家”)を渡します。第3の引数,パラメータとしてtopicに渡す値(今回は”歴史”)を渡します。渡した後に作成したオブジェクトであるnonfiction1に対して(.)ドット演算子を用いてdisplay()を呼び出します。
■実行・検証
このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。
実行してみると、基底クラスと派生クラスを定義し、派生クラスでは、独自の属性を追加。その後、displayメソッドをオーバーライドし、インスタンス化を行い、displayメソッドを呼び出す。displayメソッドを呼び出すと、各クラスの情報を表示させることができました。
コメント