【Python入門】クラス継承でコードを整理しよう【レッスン5-5】

一つ前のLessonではプロパティについて学習しました。
今回はクラスの継承について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数とスコープ編
Lesson4:データ構造編
Lesson5:オブジェクト指向編
・Lesson5-1:クラスの基本を理解しよう
・Lesson5-2:メソッドの基本を理解しよう
・Lesson5-3:カプセル化を理解しよう
・Lesson5-4:プロパティを理解しよう
・Lesson5-5:クラスの継承を理解しよう ◁今回はココ
・Lesson5-6:メソッドのオーバーライドを理解しよう
・Lesson5-7:静的メソッドを理解しよう
・Lesson5-8:モジュールを使いこなそう
・Lesson5-9:抽象クラスを理解しよう
・Lesson5-10:ミックスインを理解しよう
・Lesson5-11:データクラスを理解しよう
・練習問題5-1:モンスター捕獲ゲームを作ろう
・練習問題5-2:モンスターとのバトルゲームを作ろう
次のステップ:Pythonを用いたアプリ開発
クラスの継承とは?親クラスの機能を子クラスに受け継ぐ方法
この章ではPythonにおける「クラスの継承」の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。
クラスの継承はオブジェクト指向プログラミングにおける重要な概念です。
既存のクラス(親クラス)の機能やプロパティを引き継いで、新しいクラス(子クラス)を作成します。これによりコードの再利用が促進され、重複したコードを書く必要がなくなります。
特に、複雑なシステムでは、継承を活用することでメンテナンス性が向上し、開発効率が高まります。
クラスの継承とは?
継承を使うことで、親クラスに定義されたメソッドや属性を子クラスが引き継ぎます。
子クラスは、親クラスのすべての機能をそのまま利用できるだけでなく、必要に応じて独自のメソッドや属性を追加したり、親クラスのメソッドを変更することも可能です。
これにより、新しい機能を柔軟に追加しながらも、既存のコードを最大限に活用することができます。
クラスの継承の使用例
以下はクラスの継承を実際に使った例です。
この例ではAnimal
という親クラスを定義し、そのクラスを継承する子クラスDog
を作成しています。
# 親クラス class Animal: def __init__(self, name): self.name = name def speak(self): print(f"{self.name}が音を立てています") # 子クラス class Dog(Animal): def speak(self): print(f"{self.name}が吠えています") # インスタンスの作成 dog = Dog("ポチ") dog.speak() # 出力: ポチが吠えています
このコードではAnimal
クラスが基本的な属性name
とメソッドspeak
を持っています。
Dog
クラスはAnimal
クラスを継承し、親クラスの__init__
メソッドを利用してname
属性を初期化しますが、speak
メソッドを独自に定義し直しています。
このように継承を使うことで親クラスの機能を再利用しつつ、子クラスに固有の振る舞いを追加することができます。
クラスの継承のメリット
クラスの継承を使う主なメリットは次の通りです。
- コードの再利用
親クラスに一度定義したメソッドや属性は、子クラスで再利用できるため、重複コードを減らすことができます。 - 保守性の向上
親クラスのコードを修正すると、その変更がすべての子クラスにも自動的に反映されるため、メンテナンスが容易になります。 - 拡張性の確保
子クラスで独自の機能を追加することができるため、新しい機能を柔軟に追加できます。
これらの特徴を活用することで、効率的なプログラム設計が可能となります。
まとめ
クラスの継承は親クラスから子クラスへ機能を引き継ぐことにより、コードの再利用と保守性を向上させる手法です。
初心者にとっては最初少し難しく感じるかもしれませんが、実際にコードを書いてみるとその便利さが理解できるでしょう。
特に大規模なプロジェクトでは継承の力を借りて、シンプルかつ効率的なコード構造を実現できます。
練習問題:車両クラスでオブジェクト指向を学ぼう
クラス継承を使った車両管理プログラムを作成しましょう。
親クラス「Vehicle」を定義し、その子クラスとして「Car」と「Motorcycle」を作成します。
各クラスは共通のメソッドを持ちつつ、固有の動作を追加します。プログラムでは車両の名前を設定し、対応する動作を実行するようにしてください。
問題の詳細条件
以下の要件に従ってコードを完成させてください。
- 親クラス「Vehicle」を定義し、名前を設定するコンストラクタと名前を表示するメソッドを作成すること。
- 子クラス「Car」を「Vehicle」から継承し、車が走るメソッドを追加すること。
- 子クラス「Motorcycle」を「Vehicle」から継承し、バイクが走るメソッドを追加すること。
- 「Car」と「Motorcycle」クラスのオブジェクトを生成し、それぞれの動作を実行すること。
ただし、以下のような実行結果となるコードを書くこと。
この乗り物はトヨタです。 この乗り物はハーレーです。 トヨタが道路を走っています。 ハーレーが高速道路を疾走しています。
【ヒント】難しいと感じる人だけ見よう
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)1:親クラスVehicleの定義
□ __init__メソッドで車両の名前を設定
□ □ self.nameにnameを代入
2:introduceメソッドの定義
□ 車両の名前を表示
3:子クラスCarの定義、Vehicleクラスを継承
□ driveメソッドで車が道路を走る動作を定義
□ □ printで「道路を走っています」を表示
4:子クラスMotorcycleの定義、Vehicleクラスを継承
□ rideメソッドでバイクが高速道路を疾走する動作を定義
□ □ printで「高速道路を疾走しています」を表示
5:Carクラスのインスタンス生成、トヨタを設定
6:Motorcycleクラスのインスタンス生成、ハーレーを設定
7:Carクラスのintroduceメソッドを呼び出し
8:Motorcycleクラスのintroduceメソッドを呼び出し
9:Carクラスのdriveメソッドを呼び出し
10:Motorcycleクラスのrideメソッドを呼び出し
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 親クラス(Vehicle)の定義 class Vehicle: # コンストラクタで車両の名前を設定 """【穴埋め問題1】 ここにコンストラクタを定義し、nameという引数を受け取り、self.nameにその値を設定するコードを書いてください。 """ # 親クラスのメソッド: 車両の名前を表示 def introduce(self): print(f"この乗り物は{self.name}です。") # 子クラス(Car)の定義、Vehicleクラスを継承 """【穴埋め問題2】 ここにCarクラスを定義し、Vehicleクラスを継承してください。また、Carクラスに固有のdriveメソッドを定義し、{self.name}が道路を走っています。と表示するコードを書いてください。 """ # 子クラス(Motorcycle)の定義、Vehicleクラスを継承 class Motorcycle(Vehicle): # Motorcycleクラス固有のメソッド: バイクが走る動作 def ride(self): print(f"{self.name}が高速道路を疾走しています。") # オブジェクトの生成 """【穴埋め問題3】 ここにCarクラスのオブジェクトを生成し、"トヨタ"という名前を渡してください。また、Motorcycleクラスのオブジェクトを生成し、"ハーレー"という名前を渡してください。 """ # 親クラスのメソッドを使って名前を表示 car.introduce() motorcycle.introduce() # CarクラスとMotorcycleクラスそれぞれの固有メソッドを使用 car.drive() motorcycle.ride()
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
問題の答え合わせと解説
この問題の一つの正解例とそのコードの解説を以下に示します。
一つの正解例
例えば以下のようなプログラムが考えられます。
- 正解コード
-
# 親クラス(Vehicle)の定義 class Vehicle: # コンストラクタで車両の名前を設定 def __init__(self, name): self.name = name # 親クラスのメソッド: 車両の名前を表示 def introduce(self): print(f"この乗り物は{self.name}です。") # 子クラス(Car)の定義、Vehicleクラスを継承 class Car(Vehicle): # Carクラス固有のメソッド: 車が走る動作 def drive(self): print(f"{self.name}が道路を走っています。") # 子クラス(Motorcycle)の定義、Vehicleクラスを継承 class Motorcycle(Vehicle): # Motorcycleクラス固有のメソッド: バイクが走る動作 def ride(self): print(f"{self.name}が高速道路を疾走しています。") # オブジェクトの生成 car = Car("トヨタ") motorcycle = Motorcycle("ハーレー") # 親クラスのメソッドを使って名前を表示 car.introduce() # ここではCarクラスがVehicleクラスからintroduceメソッドを継承している motorcycle.introduce() # Motorcycleクラスも同様に継承している # CarクラスとMotorcycleクラスそれぞれの固有メソッドを使用 car.drive() # Carクラスの固有メソッド motorcycle.ride() # Motorcycleクラスの固有メソッド
正解例の詳細解説
このコードでは「クラスの継承」について学べます。
クラスを使うことで同じような機能を持つ複数のオブジェクト(ここでは「Car」や「Motorcycle」)を効率的に扱えるようになります。
以下にブロックごとに解説していきます。
- 詳細解説
-
親クラス(Vehicle)の定義
class Vehicle: def __init__(self, name): self.name = name def introduce(self): print(f"この乗り物は{self.name}です。")
Vehicleクラスは、このコードの親クラスです。
このクラスではコンストラクタ(
__init__
)で名前を設定し、その名前を表示するメソッド(introduce
)が定義されています。親クラスは共通する機能を持たせるために作られ、他のクラスで使い回すことができるようにします。
__init__(self, name)
:オブジェクトが作られたときに名前を設定する初期化メソッドです。introduce(self)
:車両の名前を表示するためのメソッドです。
子クラス(Car)の定義と継承
class Car(Vehicle): def drive(self): print(f"{self.name}が道路を走っています。")
Carクラスは親クラスであるVehicleを「継承」しています。
Pythonではクラスの後ろに
(親クラス名)
と書くことで、その親クラスの機能を子クラスで利用できるようにします。この場合CarクラスはVehicleクラスの
introduce
メソッドをそのまま使えるだけでなく、自分自身の新しいメソッド(drive
)も持っています。class Car(Vehicle)
:Vehicleクラスを継承し、新たに車専用の動作を追加しています。drive(self)
:車が走る動作を表示するメソッドです。
子クラス(Motorcycle)の定義と継承
class Motorcycle(Vehicle): def ride(self): print(f"{self.name}が高速道路を疾走しています。")
Motorcycleクラスも同じくVehicleクラスを継承しています。
このクラスでは
introduce
メソッドを利用しつつ、新たにバイク特有の動作を表すride
メソッドを追加しています。これによりコードの再利用性が高まり、Vehicleクラスに書いた機能を繰り返し書く必要がなくなります。
class Motorcycle(Vehicle)
:同様に親クラスのVehicleを継承し、新たにバイクの動作を定義しています。ride(self)
:バイクが高速道路を走る動作を表すメソッドです。
オブジェクトの生成とメソッドの使用
car = Car("トヨタ") motorcycle = Motorcycle("ハーレー") car.introduce() motorcycle.introduce() car.drive() motorcycle.ride()
ここではCarクラスとMotorcycleクラスのオブジェクトを作成しています。
作成されたオブジェクトはそれぞれのクラスの機能を持っており、親クラスから継承した
introduce
メソッドを使用しています。さらにCarクラスでは
drive
メソッド、Motorcycleクラスではride
メソッドを使って、それぞれ固有の動作を行います。car = Car("トヨタ")
:Carクラスのオブジェクトを作成し、「トヨタ」という名前を設定します。motorcycle = Motorcycle("ハーレー")
:Motorcycleクラスのオブジェクトを作成し、「ハーレー」という名前を設定します。car.introduce()
とmotorcycle.introduce()
:両方のオブジェクトで親クラスのintroduce
メソッドを使用して名前を表示します。car.drive()
とmotorcycle.ride()
:それぞれのクラスで固有の動作を実行します。
まとめ
今回のコードでは「クラスの継承」を使って親クラス(Vehicle)から共通する機能を子クラス(Car、Motorcycle)に引き継ぎました。
継承によって重複したコードを書く必要がなくなり、プログラムがより効率的に書けるようになります。
これを応用すればもっと複雑なプログラムでも柔軟に対応できるようになります。ぜひ、他の例も試して、理解を深めてください!
FAQ|Pythonのクラス継承の基本
- Q1. クラス継承を使うメリットは何ですか?
-
コードの再利用性を高め、共通機能を親クラスにまとめることで、プログラム全体の保守性と可読性が向上します。
- Q2. クラス継承とインスタンス化の関係は?
-
継承された子クラスもインスタンス化が可能で、親クラスの機能を使いつつ、独自の機能を追加することができます。
- Q3. クラス継承は複数階層で使えますか?
-
はい、Pythonでは多階層の継承が可能で、親クラス→子クラス→孫クラスといった設計ができます。
質問用コンタクトフォーム
この記事はAIを用いて書いた記事です。
人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。