導入
似たクラスをいくつも作るとき、共通部分を1つの親クラスにまとめ、それを引き継ぐのが継承です。重複を減らせます。
説明
class 子(親): と書くと、親クラスの属性・メソッドを引き継ぎます。子クラスで同じ名前のメソッドを定義すると、上書き(オーバーライド)できます。共通部分は親にまとめ、違うところだけ子で持つ、という構図です。
flowchart TB animal["親 Animal<br/>name / speak()"] animal --> dog["子 Dog<br/>speak() を上書き → ワン"] animal --> cat["子 Cat<br/>speak() を上書き → ニャー"]
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "..."
class Dog(Animal): # Animal を継承
def speak(self): # speak を上書き
return f"{self.name}: ワン"
class Cat(Animal):
def speak(self):
return f"{self.name}: ニャー"
animals = [Dog("ポチ"), Cat("タマ")]
for a in animals:
print(a.speak()) # それぞれの speak が呼ばれる
Dog も Cat も __init__ は親のものをそのまま使っています。同じ speak() という呼び方で、種類ごとに違う結果になる――これがオブジェクト指向の便利さです。
やってみよう
Bird クラスを足して speak で ピヨ と鳴かせ、リストに加えて表示してみましょう。
演習
Animal を継承した Cow クラスを作り、speak で 名前: モー を返すようにして、Cow("ベル").speak() を表示してください。
ヒント1を見る
class Cow(Animal): の中で def speak(self): return f"{self.name}: モー"。