【Python】親クラスのプロパティ・メソッドを子クラスで使いたいときの書き方

書くたびに調べることになるので、忘れないようにメモ。

親クラスと同じメソッドを子クラスでそのまま使うとき

superなどで指定しなくても普通に使える。

class Animal:
    def __init__(self, legs):
        self.legs=legs
    def legnum(self):
        return "I have " + str(self.legs) + " legs!"
 
class Dog(Animal):
    pass

John = Dog(4)
John.legs # 4
John.legnum() # "I have 4 legs!"

Pythonでは、指定したメソッドがクラス内で見つからない場合、親クラスまでたどって探してくれる。

親クラスのメソッドを使って別のメソッドを定義するとき

superが必要。でないとローカルスコープの変数とみなされ、NameErrorになる。

class Cat(Animal):
    def greet(self):
        return "Hello " + super().legnum()

Tom = Cat(4)
Tom.greet() # "Hello I have 4 legs!"

親クラスのプロパティと子クラス独自のプロパティを併用したいとき

今までの例は、子クラスで独自のコンストラクタを何も書いていなかったが、
子クラスでも独自にコンストラクタを立てると、親クラスのコンストラクタが完全に上書きされ潰されてしまう。 そうならないよう、superを使う必要がある。

class Mouse(Animal):
    def __init__(self, legs, ears):
        super().__init__(legs)
        self.ears = ears
    def greet(self):
        return "Hello " + super().legnum() + " And " + str(self.ears) + " ears!"  

Jerry = Mouse(4, 2)
Jerry.legs # 4
Jerry.greet() # "Hello I have 4 legs! And 2 ears!"