PYTHON はじめの一歩 / LESSON 12

クラスを引き継ごう。

共通する部分は親クラスにまとめ、違う部分は子クラスへ。継承、オーバーライド、super を小さな例で見よう。

学びを始める

共通の力を受け取り、違いを足す。 | 動画なしでも学べます

クラスを引き継ごう。をあおい・はる・AI先生・ROBORONと考えるイラスト
共通の力を受け取り、違いを足す。
GOAL

この回でできるようになること

  • 01継承で共通のメソッドを使う
  • 02オーバーライドで子の動作を変える
  • 03super() で親の初期化を呼ぶ
ことばの窓
01 / EXPLORE

共通の動きを引き継ぐ

class GuideRobot(Robot): と書くと、GuideRobot は Robot のメソッドを使えます。

あおい

案内役も、掃除役も、まずはあいさつできるようにしたいな。

AI先生

共通のあいさつを親の Robot に書こう。子はその力を引き継げるんだよ。

はる

共通部分を1か所で直せるので、管理しやすいですね。

実際のコードまず結果を予想してみよう
class Robot:
    def greet(self):
        return "こんにちは!"

class GuideRobot(Robot):
    pass

print(GuideRobot().greet())
実行するとこんにちは!

なぜ? GuideRobot には greet を直接書いていませんが、親 Robot から受け継いで使えます。

目で見てわかる共通の動きを引き継ぐ
図12-1 共通の動きを子が利用します。
図12-1 共通の動きを子が利用します。
ROBORONのチェック!

共通点がないものまで無理に継承でつなげないようにしよう。

02 / EXPLORE

子だけ違う動きにする

子クラスで同じ名前のメソッドを定義すると、その子では新しい内容が使われます。これがオーバーライドです。

あおい

案内役なら『こちらへどうぞ』と言ってほしい!

AI先生

その子だけ greet を書き直してみよう。親の Robot のあいさつは変わらないよ。

はる

同じメソッド名でも、呼び出す実物によって結果が変わります。

実際のコードまず結果を予想してみよう
class Robot:
    def greet(self):
        return "こんにちは!"
class GuideRobot(Robot):
    def greet(self):
        return "こちらへどうぞ!"

print(Robot().greet())
print(GuideRobot().greet())
実行するとこんにちは! / こちらへどうぞ!

なぜ? GuideRobot だけ greet を上書きしました。元の Robot の動きは残ります。

目で見てわかる子だけ違う動きにする
図12-2 同じ呼び出し名でも、実物によって違います。
図12-2 同じ呼び出し名でも、実物によって違います。
ROBORONのチェック!

親の動きも残したい場合は super() を使えます。

03 / EXPLORE

親の準備を先に使う

子クラス独自のデータを足す場合も、親の初期化を super().__init__() で呼べます。

あおい

案内役に名前だけでなく、担当場所も持たせたい!

AI先生

親に名前を準備してもらってから、子で担当場所を追加しよう。

はる

共通の初期化を二重に書かずに済みますね。

実際のコードまず結果を予想してみよう
class Robot:
    def __init__(self, name):
        self.name = name
class GuideRobot(Robot):
    def __init__(self, name, place):
        super().__init__(name)
        self.place = place

robot = GuideRobot("ROBORON", "入口")
print(robot.name, robot.place)
実行するとROBORON 入口

なぜ? 親 Robot が name を設定し、子 GuideRobot が place を設定します。

目で見てわかる親の準備を先に使う
図12-3 親の準備を使い、子の情報を足します。
図12-3 親の準備を使い、子の情報を足します。
ROBORONのチェック!

super() は『親に仕事をお願いする』感覚で覚えよう。

04 / YOUR TURN

予想して、理由まで確かめよう

答えを選んだら、説明を読んでから実行欄でも試してみよう。

チャレンジどれになるかな?

子クラスで親と同じ名前のメソッドを定義すると?

答えを選ぶと理由が表示されます。

PUT IT TOGETHER

小さな練習:親のあいさつに一言足そう

Robot.greet() の『こんにちは!』に、GuideRobot で『ご案内します。』を足して返そう。

ヒント:子の greet() から super().greet() を呼びます。

解き方の一例と理由を見る
class Robot:
    def greet(self):
        return "こんにちは!"
class GuideRobot(Robot):
    def greet(self):
        return super().greet() + " ご案内します。"
print(GuideRobot().greet())

親の結果を使い、その後ろに子の言葉を加えます。

COFFEE BREAK

似ているだけでは継承しない

あおい

何でも親子にすれば短く書けるかも!

AI先生

似ていても役割が違うものは、無理につなげると後で困るんだよ。『子は親の一種と言える?』を先に考えようね。

はる

共通化の前に、意味のある関係か確かめます。

05 / RUN PYTHON

自分の手で動かそう

例題を選び、結果を予想してから「実行する」を押そう。値を変えると、どの行が結果を決めるか見えてくるよ。

例題を選ぶ

書き換えて試せます。Tabキーは半角スペース4つ分です。

子は親の greet を使えます。

この入力欄の使い方

コード内の input() に渡す値を1行ずつ書きます。input() がない例では空欄で大丈夫です。複数回呼ぶコードでは上から順に使います。

準備できました。

実行結果

実行すると、ここに結果を表示します。

Pythonは閲覧中の端末内で動作します。

AI先生からひとこと

共通の力を受け取り、違いを足す。 今日覚えた道具を、別の値でも試してみよう。自分で理由を説明できたら、とてもいい進歩なんだよ。