
この回でできるようになること
- 01継承で共通のメソッドを使う
- 02オーバーライドで子の動作を変える
- 03super() で親の初期化を呼ぶ
共通の動きを引き継ぐ
class GuideRobot(Robot): と書くと、GuideRobot は Robot のメソッドを使えます。

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

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

共通部分を1か所で直せるので、管理しやすいですね。
class Robot:
def greet(self):
return "こんにちは!"
class GuideRobot(Robot):
pass
print(GuideRobot().greet())
なぜ? GuideRobot には greet を直接書いていませんが、親 Robot から受け継いで使えます。

共通点がないものまで無理に継承でつなげないようにしよう。
子だけ違う動きにする
子クラスで同じ名前のメソッドを定義すると、その子では新しい内容が使われます。これがオーバーライドです。

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

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

同じメソッド名でも、呼び出す実物によって結果が変わります。
class Robot:
def greet(self):
return "こんにちは!"
class GuideRobot(Robot):
def greet(self):
return "こちらへどうぞ!"
print(Robot().greet())
print(GuideRobot().greet())
なぜ? GuideRobot だけ greet を上書きしました。元の Robot の動きは残ります。

親の動きも残したい場合は super() を使えます。
親の準備を先に使う
子クラス独自のデータを足す場合も、親の初期化を super().__init__() で呼べます。

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

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

共通の初期化を二重に書かずに済みますね。
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)
なぜ? 親 Robot が name を設定し、子 GuideRobot が place を設定します。

super() は『親に仕事をお願いする』感覚で覚えよう。
予想して、理由まで確かめよう
答えを選んだら、説明を読んでから実行欄でも試してみよう。
子クラスで親と同じ名前のメソッドを定義すると?
答えを選ぶと理由が表示されます。

小さな練習:親のあいさつに一言足そう
Robot.greet() の『こんにちは!』に、GuideRobot で『ご案内します。』を足して返そう。
ヒント:子の greet() から super().greet() を呼びます。
解き方の一例と理由を見る
class Robot:
def greet(self):
return "こんにちは!"
class GuideRobot(Robot):
def greet(self):
return super().greet() + " ご案内します。"
print(GuideRobot().greet())親の結果を使い、その後ろに子の言葉を加えます。
似ているだけでは継承しない

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

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

共通化の前に、意味のある関係か確かめます。
自分の手で動かそう
例題を選び、結果を予想してから「実行する」を押そう。値を変えると、どの行が結果を決めるか見えてくるよ。
書き換えて試せます。Tabキーは半角スペース4つ分です。
子は親の greet を使えます。
この入力欄の使い方
コード内の input() に渡す値を1行ずつ書きます。input() がない例では空欄で大丈夫です。複数回呼ぶコードでは上から順に使います。
準備できました。
実行結果
実行すると、ここに結果を表示します。
Pythonは閲覧中の端末内で動作します。

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