この投稿は下記の記事の続きになります。
Pythonのクラスの使い方その1
Pythonのクラスの使い方その2

今回は、クラスの継承について説明していきます。

1. 継承の概要

Pythonのクラスの使い方その1Pythonのクラスの使い方その2で人間クラスを定義しました。
今回は、社会人という新しいクラスを定義します。
社会人というクラスには、どんな属性が必要でしょうか。
例えば、次の様な情報が考えられます。

・名前
・年齢
・所属会社

上記の「名前」や「年齢」は、人間クラスと同じ属性です。
このままクラスを作ると、同じような構造を持ったクラスが重複してしまいますし、あまり効率的とは言えません。

そこで、人間クラスを元として、人間クラスの持つ属性を受け継いだ社会人クラスを作成することとします。
このように、基本となるクラスを元にして、基本となるクラスの属性を受け継いだ新しいクラスを作ることを「継承」と言います。
継承元となるクラスの事を、「スーパークラス」、継承元を受け継いで作ったクラスの事を「サブクラス」と言います。
今回は人間クラスがスーパークラスで、社会人クラスがサブクラスになります。
また、スーパークラスとサブクラスは、親子関係に例えることもあります。
この場合、人間クラスが親クラス、社会人クラスが子クラスになります。
スーパークラスは、複数のサブクラスの継承元になることができます。
サブクラスは、複数のスーパークラスを継承元として作成でき、これを「多重継承」と言います。
多重継承については後述します。

2. 継承を利用したクラスの定義

継承を利用したクラスは下記のように定義をします。

class Society(Person): 
    # 人間クラスを継承した社会人クラスの定義
    #コンストラクタ。スーパークラスが持つ属性と、サブクラスのみが持つ属性の初期化を行う。
    def __init__(self,name,age,company):
        super().__init__(name,age) # スーパークラスのコンストラクタの呼び出し
        self.company = company     # サブクラスの属性の初期化

継承を利用するクラスは、「class クラス名(スーパークラス名):」の形式で定義を行います。
コンストラクタに、サブクラスのみが持つ属性を定義することができます。
その際に、「super().__init__(スーパークラスのコンストラクタに渡す引数(複数指定可))」と記述することで、スーパークラスのコンストラクタを呼び出すことができます。

3. 継承を利用したメソッドの定義

サブクラスは、スーパークラスの属性だけではなく、メソッドも受け継いでいます。
スーパークラスのメソッドをそのまま使用する場合は、サブクラスに定義しなおす必要はありません。
サブクラスにメソッドを定義するのは、以下のような場合です。

・サブクラスでスーパークラスのメソッドを再定義する。
・スーパークラスのメソッドに、サブクラスで処理を付け足し、拡張する。
・サブクラス独自のメソッドを追加する。

class Society(Person): # 人間クラスを継承した社会人クラスの定義
    #コンストラクタ。スーパークラスが持つ属性と、サブクラスのみが持つ属性の初期化を行う。
    def __init__(self,name,age,company):
        super().__init__(name,age) # スーパークラスのコンストラクタの呼び出し
        self.company = company     # サブクラスの属性の初期化

    # スーパークラスの「自己紹介をする」メソッドを再定義する。
    def selfIntroduction(self):
        print('私の名前は',self.name,
              'です。年齢は',self.age,'歳です。所属会社は',
              self.company,'です。よろしくお願いします。')  
 
    # スーパークラスの「挨拶をする」メソッドに処理を付け足す。
    def greet(self,greetWord):
        super().greet(greetWord)
        print('お元気ですか?')

    # サブクラス独自のメソッドを追加する。
    def answerCompany(self):
        return self.company

スーパークラスで定義したメソッドを、サブクラスで再定義することを「オーバーライド」と言います。
オーバーライドをする際は、スーパークラスで定義したメソッドと同じメソッド名で定義をする必要があります。
また、サブクラスでスーパークラスのメソッドに処理を付け足す場合、オーバーライドと同様に、スーパークラスで定義したメソッドと同じメソッド名で定義を行い、「super().スーパークラスのメソッド名(引数)」でスーパークラスのメソッドを呼び出す必要があります。

4. サブクラスのメソッドを呼び出す

サブクラスのメソッドは、サブクラスのインスタンスを作成して呼び出すことができます。

soc1 = Society('田中',22,'●●会社') # サブクラスのインスタンスの作成

# サブクラスでオーバーライドしたメソッドの呼び出し。
soc1.selfIntroduction()

# サブクラスで処理を付け足して拡張したメソッドの呼び出し。
soc1.greet('こんにちは')

# サブクラスで新しく定義したメソッドの呼び出し。
print('所属会社:',soc1.answerCompany())

# 実行結果
# こんにちは、私の名前は田中です。年齢は22歳です。所属会社は●●会社です。よろしくお願いします。
# こんにちは
# お元気ですか?
# 所属会社: ●●会社

5. クラスの多重継承

Pythonでは、サブクラスを定義する際、継承元であるスーパークラスを複数指定することができます。これを「多重継承」と言います。
多重継承は、サブクラスを定義する際に「class クラス名(スーパークラス名1,スーパークラス名2,…):」と記述します。

継承を利用すると、同じようなクラスをいくつも定義する必要がなくなったり、関連性を持ったクラスを紐付けることができます。
新しいクラスを作成する際は、既に定義したクラスから継承できないかを考慮しながら作成できると、より効率的なプログラミングが行えるようになります。

弊社主催のPython基礎研修では、基礎文法を始め、Python未経験の方でもわかりやすいカリキュラムでPythonの基礎をマスターできます。
講座は随時開催しておりますので、ご興味のある方は是非お気軽にお問い合わせください。