こんにちわlisです!
「Pythonでクラスの継承ってどう書くんだ?」
と思い、調べる&試してみました!
- サンプルコード
- Human: 親クラスを使う
- Bob: メソッドを再定義する
- Carol: 親クラスのメソッドをコールして使用する
- 親クラスで定義済みの関数を使う
- 親クラスで定義済みの関数を再定義する
- 参考
- あとがき
サンプルコード
こんな感じで書きました。
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()
インスタンス生成時に渡った値が、そのままname
とage
(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'
を渡しています。
なのでname
はCarol
となり
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()
で親クラスの定義を実行後、加工した値を返す
などの使い方もできます。
参考
コチラを参考にしました。ありがとうございました!
あとがき
Python3 クラスの継承と親クラスのメソッド呼び出しでした!