【第24回Python基礎講座】親の能力を受け継ぐ!クラスの継承

本ページはプロモーションが含まれています
【第24回Python基礎講座】親の能力を受け継ぐ!クラスの継承
国内のAI狂い

やっほー!国内のAI狂いだよ!✨

第24回へようこそ!前回は「たい焼きの型(クラス)」を作ったよね。
でも、もし「白いたい焼き」や「クロワッサンたい焼き」を作りたくなったら、またゼロから型を作り直すの?面倒くさいよね?
そんな時に使うのが「継承(Inheritance)」
元の型の機能をコピーしつつ、新しい機能を追加したり改造したりできる、まさに「パワーアップ」のための仕組みなんだ!💪🐟

公式の「ここがわかりにくい」:派生クラス?基底クラス?

公式ドキュメントには、こんな専門用語が並んでいるよ。

派生クラス (derived class) の定義の構文は以下のようになります。
class DerivedClassName(BaseClassName): ...

うーん、言葉が硬い!(笑)
要するにこういう親子関係のことだよ👇

  • 基底クラス (Base Class)親クラス。元になる設計図。(スーパークラスとも言う)
  • 派生クラス (Derived Class)子クラス。親の能力を受け継いだ新しい設計図。(サブクラスとも言う)

Pythonでは「新しいクラス(親クラス)」と書くだけで、親の能力を全部コピーできちゃうんだ!

1. 継承のやり方:親の名前を書くだけ!

要するにこれは「既存のクラスの機能をまるごとコピーして、新しいクラスを作る機能」だよ!

まずは、前回の「普通のたい焼き(Taiyaki)」クラスを親にして、「白いたい焼き(WhiteTaiyaki)」クラスを作ってみよう。
白いたい焼きも「あんこを入れる」とか「泳ぐ」機能は同じだから、継承を使えばコードを書く量を減らせるよ。

🐍 サンプルコードを見る(クリックで開閉)
# 親クラス(普通のたい焼き)
class Taiyaki:
    def __init__(self, nakami):
        self.nakami = nakami

    def swim(self):
        print(f"{self.nakami}たい焼きは泳いだ!")

# 子クラス(白いたい焼き)
# カッコの中に親クラス名を書く!
class WhiteTaiyaki(Taiyaki):
    pass  # とりあえず機能追加なし

# 白いたい焼きを焼く
white = WhiteTaiyaki("カスタード")

# 親譲りの機能が使える!
white.swim()
💻 実行結果:
カスタードたい焼きは泳いだ!

すごい!WhiteTaiyaki の中には何も書いてないのに、ちゃんと swim メソッドが使えたね!
これが継承のパワーだよ✨

2. オーバーライド:親とは違う動きをする!

要するにこれは「親から受け継いだ機能を、自分流に書き換える機能」だよ!

でも、白いたい焼きは「モチモチしてる」のが特徴だよね。
親と同じ泳ぎ方じゃつまらないから、swim メソッドを改造しよう!
これをオーバーライド(Override)と呼ぶよ。

🐍 改造コードを見る(クリックで開閉)
class WhiteTaiyaki(Taiyaki):
    # 親と同じ名前のメソッドを定義すると上書きされる
    def swim(self):
        print(f"{self.nakami}の白いたい焼きは、モチモチ泳いだ!")

# 普通のたい焼き
normal = Taiyaki("あんこ")
normal.swim()

# 白いたい焼き
white = WhiteTaiyaki("カスタード")
white.swim()
💻 実行結果:
あんこたい焼きは泳いだ!
カスタードの白いたい焼きは、モチモチ泳いだ!

子クラスでメソッドを定義し直すと、子クラスのインスタンスではそちらが優先して使われるんだね。

3. 【試験頻出】super():親の力も借りたい!

完全に上書きするんじゃなくて、「親の処理を実行した上で、追加の処理をしたい」って時もあるよね。
特に __init__(初期化)メソッドでよくあるパターンだよ。

そんな時は super() 関数を使って親クラスを呼び出すんだ。

🐍 タピオカ入りの生地にする(クリックで開閉)
class WhiteTaiyaki(Taiyaki):
    def __init__(self, nakami, dough="タピオカ粉"):
        # まず親の __init__ を呼んで、nakami を設定してもらう
        super().__init__(nakami)
        
        # その後で、自分独自の dough(生地)を設定
        self.dough = dough

    def info(self):
        print(f"中身: {self.nakami}, 生地: {self.dough}")

white = WhiteTaiyaki("チョコ")
white.info()
💻 実行結果:
中身: チョコ, 生地: タピオカ粉
【重要】 super().__init__(...)
これを書き忘れると、親クラスで設定している変数(self.nakamiなど)が作られず、エラーになることがあるから注意してね!

4. isinstance と issubclass

「このオブジェクトは、たい焼きの一種かな?」って調べたい時は、便利な組み込み関数があるよ。

  • isinstance(obj, class):そのオブジェクトは、そのクラス(または子クラス)のインスタンスか?
  • issubclass(classA, classB):AはBの子クラスか?
# 白いたい焼きは、Taiyakiの一種?
print(isinstance(white, Taiyaki))
# -> True (子クラスのインスタンスは、親クラスのインスタンスでもある!)

# Taiyakiは、WhiteTaiyakiの一種?
print(isinstance(normal, WhiteTaiyaki))
# -> False (親は子ではない)

試験に出る!要注意ポイント

今回の範囲で、Python 3 エンジニア認定基礎試験によく出るポイントをまとめたよ!📝

① 多重継承(Multiple Inheritance)

Pythonは、複数の親を持つことができるんだ(多重継承)。
class Child(Father, Mother): みたいにカンマで区切って書くよ。
もし親同士に同じ名前のメソッドがあったら、「左に書いた親」が優先されるというルール(MRO: Method Resolution Order)があるから覚えておいてね。

② 属性の検索順序

obj.x にアクセスした時、Pythonは以下の順で探すよ。
1. インスタンス自身
2. そのクラス
3. 親クラス(基底クラス)
どこにもなければ AttributeError になるよ。

💡 管理人の失敗エピソード
super().__init__() を呼び忘れて、子クラスで親の変数を使おうとしたら「そんな変数ないよ!」って怒られたことがあるよ😭
「親の初期化」は自動ではやってくれないから、子クラスで __init__ を書くときは必ず super() を呼ぶ癖をつけよう!

理解度チェック!ミニクイズ

クラスの継承、理解できたかな?
試験レベルの問題でチェックしてみよう!🔍

親クラス Parent を継承した子クラス Child を定義する正しい構文は?
  1. class Child extends Parent:
  2. class Child(Parent):
  3. class Child inherits Parent:
▼ クリックで正解を表示
正解: 2. class Child(Parent):

解説:
Pythonではクラス名の後ろのカッコ () の中に親クラス名を書くことで継承できるよ。
extends はJavaなどの言語で使われるキーワードだね。

子クラスから親クラスのメソッドを呼び出すために使う関数は?
  1. parent()
  2. base()
  3. super()
▼ クリックで正解を表示
正解: 3. super()

解説:
super() を使うと、親クラス(スーパークラス)のメソッドにアクセスできるよ。
特に super().__init__() は必須テクニック!

親クラスのメソッドを子クラスで再定義することを何と言う?
  1. オーバーロード (Overload)
  2. オーバーライド (Override)
  3. オーバーライト (Overwrite)
▼ クリックで正解を表示
正解: 2. オーバーライド (Override)

解説:
「上書きする」という意味でオーバーライドだよ。
オーバーロード(多重定義)は「引数の数や型が違う同名メソッドを定義する」ことで、Pythonでは標準ではサポートされていない概念なんだ。

まとめ:次回への引き

今回は「クラスの継承」について解説したよ!
たい焼きのバリエーションを増やすように、クラスを拡張していけるイメージがつかめたかな?✨

さて、次回はいよいよ最終回!…の前に、もう一つだけ大事なトピックがあるよ。
テーマは「変数の有効範囲!スコープと名前空間」だよ。
「関数の中で作った変数が、外から使えない!?」なんて経験ない?
変数がどこで生きて、どこで死ぬのか。そのルールを知れば、バグの原因がスッキリ分かるようになるよ!お楽しみに!👋✨

出典: Python公式チュートリアル
Copyright © 2001-2026 Python Software Foundation. Licensed under the PSF License.

よかったらシェアしてね!
  • URLをコピーしました!
目次