01 / 07
ほとんど同じクラスが2つ
会員のクラスを作ったとしよう。名前を持っていて、あいさつができる。
そこに「プレミアム会員」を足したくなった。名前を持つのも、あいさつするのも会員とまったく同じ。ちがうのは送料が無料になることだけだ。
このためにクラスをもう1つ丸ごと書くと、同じ中身が2か所に並ぶ。片方だけ直して食いちがうのが、いちばんこわいよね。
クラス
INPUT · スライド
01 / 07
会員のクラスを作ったとしよう。名前を持っていて、あいさつができる。
そこに「プレミアム会員」を足したくなった。名前を持つのも、あいさつするのも会員とまったく同じ。ちがうのは送料が無料になることだけだ。
このためにクラスをもう1つ丸ごと書くと、同じ中身が2か所に並ぶ。片方だけ直して食いちがうのが、いちばんこわいよね。
02 / 07
クラス名のうしろに (Kaiin) と書くと、Kaiin の中身をそのまま受けついだクラスが作れる。これを継承(けいしょう。受けつぐこと)と呼ぶよ。
下の PremiumKaiin には __init__ も aisatsu も書いていない。それでも両方使える。書いていないものは、もとのクラスから借りてくるんだ。
class Kaiin: def __init__(self, namae): self.namae = namae def aisatsu(self): print(f"{self.namae}さん、こんにちは")class PremiumKaiin(Kaiin): def tokuten(self): print(f"{self.namae}さんはそうりょうむりょう")p = PremiumKaiin("ゆい")p.aisatsu()p.tokuten()実行結果
ゆいさん、こんにちは ゆいさんはそうりょうむりょう
03 / 07
もとになったほうを親(基底クラスともいう)、受けついだほうを子(派生クラスともいう)と呼ぶよ。
受けつぎは一方通行だ。子は親のものを使えるけれど、親は子のことを何も知らない。親から作った実物に tokuten は無いので、呼ぶとエラーになる。
class Kaiin: def __init__(self, namae): self.namae = namaeclass PremiumKaiin(Kaiin): def tokuten(self): print("そうりょうむりょう")k = Kaiin("はると")k.tokuten()実行結果
AttributeError: 'Kaiin' object has no attribute 'tokuten'
04 / 07
子クラスに __init__ を書いていないのに、PremiumKaiin("ゆい") と名前を渡せたのはなぜだろう。
__init__ も受けついでいるからだよ。実物が生まれるときに走るのは親の __init__。だから持ちものの namae も、ちゃんと用意される。
前のレッスンで書いた __str__ も同じ。親に書いておけば、子の実物をそのまま print できるよ。
class Kaiin: def __init__(self, namae, point): self.namae = namae self.point = point def __str__(self): return f"{self.namae}({self.point}ポイント)"class PremiumKaiin(Kaiin): def tokuten(self): print("そうりょうむりょう")p = PremiumKaiin("ゆい", 120)print(p)p.tokuten()実行結果
ゆい(120ポイント) そうりょうむりょう
05 / 07
1つの親から、子はいくつでも作れる。共通の部分の置き場所は親の1か所だけだよ。
直したくなったときも1か所ですむ。書く量が減るより、直す場所が減るのが継承のねらいだと思っておこう。
class Kaiin: def __init__(self, namae): self.namae = namae def aisatsu(self): print(f"{self.namae}さん、こんにちは")class PremiumKaiin(Kaiin): def tokuten(self): print("そうりょうむりょう")class GakuseiKaiin(Kaiin): def waribiki(self): print("がくわりではんがく")p = PremiumKaiin("ゆい")g = GakuseiKaiin("はると")p.aisatsu()g.aisatsu()実行結果
ゆいさん、こんにちは はるとさん、こんにちは
06 / 07
迷ったときの目安は「どの子にも当てはまるか」だよ。
「たまたま2つの子で同じ処理だから」という理由で親に上げると、3つめの子が来たときに困ることになる。
07 / 07
ここまでは「親にあるものを、そのまま使う」話だった。
でも、プレミアム会員のあいさつだけ特別にしたいこともあるよね。受けついだ動きを子で書き直すやりかたは、次のレッスンで扱うよ。
まずは、受けついで使うところまでを手で書いてみよう。