C
Python/オブジェクト指向/Lesson 18

クラスの継承

45分·theory
このチャプター
2/3
Python

クラスの継承

🎯 このレッスンを読み終えたら

このレッスンを読み終えると、以下の3つを自信を持ってできるようになります。

  • ✅ 単一継承 vs 多重継承 + MRO (Method Resolution Order)
  • ✅ super() を使うべきタイミング
  • ✅ 抽象クラス (abc.ABC + @abstractmethod)

これらの学習目標をチェックリストとして手元に置き、すべて答えられるようになったらレッスンを閉じてください。

継承 — コード + 実行結果

class 子クラス(親クラス): = 親の属性・メソッドをそのまま引き継ぎ + 子が追加・再定義する

💻 継承のサンプル
# ============================================
# 📌 このコードがすること: 継承で共通機能を親クラスから受け継ぎます
# 📌 実生活の比喩: 継承は「遺伝」と同じです。
#    犬(Dog)は動物(Animal)の特性を受け継ぎ、
#    自分だけの固有の特性(breed, ワンワン)を追加します。
# ============================================

# 🔹 親クラス (基底クラス): 共通の属性とメソッドを定義します
class Animal:
    def __init__(self, name):
        self.name = name  # 🔹 すべての動物の共通属性

    def speak(self):
        return "音を出します"  # 🔹 基本実装 (子クラスで再定義予定)

# 🔹 子クラス: 括弧の中に親クラスを書いて継承を宣言
class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # 🔹 super(): 親クラスの __init__ を呼び出し (name初期化)
        self.breed = breed      # 🔹 Dogだけの追加属性

    def speak(self):  # 🔹 メソッドオーバーライディング: 親のspeakをDogに合わせて再定義
        return "ワンワン!"

    def fetch(self):
        return f"{self.name}がボールをくわえてきます" # 🔹 Dogだけの新しいメソッド追加 (Animalにはない)

class Cat(Animal):
    def speak(self):
        return "ニャー!"  # 🔹 Catもspeakオーバーライディング
    # 🔹 __init__ 未定義 → 親(Animal)の __init__ を自動使用

# 🔹 使用
dog = Dog("バドゥギ", "ジンドッグ")
cat = Cat("ナビ")

print(dog.speak())   # ✅ 実行結果: ワンワン! (オーバーライドされたメソッド)
print(cat.speak())   # ✅ 実行結果: ニャー! (オーバーライドされたメソッド)
print(dog.fetch())   # ✅ 実行結果: バドゥギ がボールをくわえてきます (Dog固有メソッド)
# ❌ cat.fetch() → AttributeError: Catにはfetchがない

# 🔹 継承関係確認
print(isinstance(dog, Animal))  # ✅ 実行結果: True (DogはAnimalのインスタンス)
print(isinstance(dog, Dog))     # ✅ 実行結果: True
print(issubclass(Dog, Animal))  # ✅ 実行結果: True (DogはAnimalのサブクラス)

💡 重要ポイント

1. class Child(Parent): の形式で継承する
2. super() で親のメソッドを呼び出す
3. isinstance()issubclass() で関係を確認する

PythonのOOPはクラス (class) でオブジェクトを定義します。__init__ はコンストラクタ、self はインスタンスへの参照です。継承は class Child(Parent): で実装し、super() で親のメソッドを呼び出します。@property でgetter/setterを実装し、@classmethod/@staticmethod でクラスメソッドや静的メソッドを定義します。多重継承とMRO (Method Resolution Order) もサポートされています。

🐍 試してみよう — クラスの継承

上記の概念を実際にコードとして実行してみましょう。値を変えながら動作を直接確認するのが、最も速い学習方法です。
✏️ Python 코드
📟 コンソール出力
▶ 実行ボタンを押してください
🐍 Pyodideで実際のPythonを実行 — 初回は読み込みに3〜5秒

🤖 AIにこう頼んでみよう

このレッスンの概念を理解すれば、AIに具体的な指示が出せるようになります。漠然とした「直して」ではなく、語彙を持ったリクエスト — それがトークン節約の第一歩です。

  • 「このdict型のデータ構造をdataclassに書き換えて」
  • 「このクラスに__repr__と__eq__を適切に追加して」

なぜこれがトークンを減らすのか

概念を知らないと、AIの回答を受け取っても「それって何ですか?」とまた聞き直す羽目になります。その「聞き直し」こそがトークンを消費します。概念を一度理解しておけば、会話が一度で完結します。

継承 - Python