lisz-works

プログラミングと興味を貴方に

Python3 クラスの継承と親クラスのメソッド呼び出し

【スポンサーリンク】

Python

こんにちわlisです!

「Pythonでクラスの継承ってどう書くんだ?」

と思い、調べる&試してみました!

サンプルコード

こんな感じで書きました。

class Human():
    def __init__(self, name: str, age: int = 10):
        self.name = name
        self.age = age

    def status(self):
        print(f'{self.name}({self.age})')

class Bob(Human):
    def __init__(self, name: str, age: int = 10):
        self.name = 'Mr.' + name
        self.age = age + 5

class Carol(Human):
    def __init__(self):
        super(Carol, self).__init__('Carol')

if __name__ == '__main__':
    alice = Human('Alice')
    alice.status()
    bob = Bob('Bob')
    bob.status()
    carol = Carol()
    carol.status()

# 結果
# Alice(10)
# Mr.Bob(15)
# Carol(10)

__init__でパラメータを設定して、status()で表示するだけの代物です。

Human: 親クラスを使う

これは通常時にクラスを使うのと変わらないですね。

alice = Human('Alice')
alice.status()

インスタンス生成時に渡った値が、そのままnameage(ageはデフォルト引数)に代入されます。

status()実行時に、これが出力されます。

Alice(10)

Bob: メソッドを再定義する

Bobクラスでは、__init__()を再定義しています。

Human.__init__()で定義した内容でなく、Bob.__init__()で定義した内容が実行されます。

なので

self.name = 'Mr.' + name

のように加工済みのname

Mr.Bob(15)

が出力されます。

Carol: 親クラスのメソッドをコールして使用する

Carolクラスでは、__init__()を再定義していますが、親クラスであるHuman__init__()

super(Carol, self).__init__('Carol')

のようにして、明示的にコールしています。

このとき引数として、'Carol'を渡しています。

なのでnameCarolとなり

Carol(10)

と出力されます。

親クラスで定義済みの関数を使う

さて、しれっとBobクラス、Carolクラスでstatus()を使っていますが、BobクラスとCarolクラスのコードを見てみましょう。

BobクラスとCarolクラスは出力を担う関数を書いていません。

しかし出力ができます。

これはHumanクラスを継承することで、Humanクラスで定義しているstatus()を持っているからです。

書かなくても持っています。

なので一見実装していないのに

bob.status()
carol.status()

とすることで、Human.status()で定義したstatus()がコールできるわけですね。

親クラスで定義済みの関数を再定義する

前述の__init__()同様、このようなメソッドも再定義が可能です。

例えばCarolクラスのstatus()

class Carol(Human):
    ...

    def status(self):
        print(f'{self.name}!!! ({self.age})')

こんな感じで書き換えると

Carol!!! (10)

このように出力されます。

class Carol(Human):
    ...

    def status(self):
        super(Carol, self).status()

__init__()でやったことと同じく、super()で親クラスで定義したメソッドを使うこともできます。

なので

  • 事前に値を加工して、super()で親クラスの定義を利用する
  • super()で親クラスの定義を実行後、加工した値を返す

などの使い方もできます。

参考

コチラを参考にしました。ありがとうございました!

blog.codecamp.jp

あとがき

Python3 クラスの継承と親クラスのメソッド呼び出しでした!

www.lisz-works.com