クラス

INPUT · スライド

もとのクラスを受けつぐ

01 / 07

ほとんど同じクラスが2つ

会員のクラスを作ったとしよう。名前を持っていて、あいさつができる。

そこに「プレミアム会員」を足したくなった。名前を持つのも、あいさつするのも会員とまったく同じ。ちがうのは送料が無料になることだけだ。

このためにクラスをもう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

受けついだ動きを変えたくなったら

ここまでは「親にあるものを、そのまま使う」話だった。

でも、プレミアム会員のあいさつだけ特別にしたいこともあるよね。受けついだ動きを子で書き直すやりかたは、次のレッスンで扱うよ。

まずは、受けついで使うところまでを手で書いてみよう。