class Person():
def __init__(self, name, age):
print("Personクラスでインスタンスを生成しました。")
self.name = name
self.age = age
def get_age(self):
print(f"Personクラスで{self.age}歳と出力します。")
class NewPerson(Person):
def __init__(self, name, age, gender):
print("NewPersonクラスでインスタンスを生成します。")
self.name = name
self.age = age
def get_age(self):
print(f"NewPersonクラスで{self.age}歳と出力します。")
tamura = NewPerson("田村",23,"male")
tamura.get_age()
NewPersonクラスでインスタンスを生成します。 NewPersonクラスで23歳と出力します。
出力結果をみると NewPersonクラスでインスタンスを生成します。
と表示されている。
これはNewPerson
クラスの__init__メソッド内の処理だ。Person
クラスの__init__メソッドを再定義して上書きしていることがわかる。
また__init__メソッドだけでなく、他のメソッドも親クラスと同じメソッド名で、子クラスで再定義すると上書きが可能だ。
スーパークラスを用いたオーバーライド
オーバーライドを行うと、親クラスのメソッドの処理内容をすべて上書きできる。
しかし、少し追記して残りはそのままにしたい場合、親クラスと子クラスのコードに重複が発生し見栄えが悪く手間がかかる。
そんな時に、スーパークラスを用いたオーバーライドをすることで、よりスマートなコードを記述することができるぞ!スーパークラスを使うと、いちいち親クラスのinitで定義をしていたものを記載する必要がない。
class Person():
def __init__(self, name, age):
print("インスタンスを生成しました。")
self.name = name
self.age = age
def info(self):
print(f"{self.name}さんは{self.age}歳です。")
class NewPerson2(Person):
def __init__(self, name, age, gender):
super().__init__(name, age)
self.gender = gender
def info(self):
super().info()
print(f"性別は{self.gender}です。")
miyazaki = NewPerson2("宮崎",29,"女性")
miyazaki.info()
インスタンスを生成しました。 宮崎さんは29歳です。 性別は女性です。
スーパークラスを用いて、__init__メソッドとメソッドinfo
をオーバーライドしている。
スーパークラスを用いたオーバーライドの方法
super().メソッド名(引数)
引数にselfは必要はない。引数がない場合は()のみでOK。
特に__init__メソッドのオーバーライドは頻出なため、チェックしておこう。
super().__init__(継承する引数)
再度注意になるがselfを入れる必要はないぞ
コメント