オーバーライド python

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を入れる必要はないぞ

コメント

タイトルとURLをコピーしました