メッソドのオーバーライド、superによる親のメソッドの呼び出し


メソッドのオーバーライド

継承後、メソッドを再定義(上書き)すること

qiita.py
class Car(object):
    def run(self):
        print("run")

class ToyotaCar(Car):
    def run(self):
        print("toyta_run")

class TeslaCar(Car):
    def run(self):
        print("tesla_run")

car = Car()
car.run()
#実行結果:run

toyota_car = ToyotaCar()
toyota_car.run()
#実行結果:toyota_run

tesla_car = TeslaCar()
tesla_car.run()
#実行結果:tesla_run
qiita.py
class Car(object):
    def __init__(self,model=None):
        #ベースクラスは何も設定しない
        self.model = model

    def run(self):
        print("run")

class ToyotaCar(Car):
    def run(self):
        print("toyta_run")

class TeslaCar(Car):
    def run(self):
        print("tesla_run")

toyota_car = ToyotaCar("Lexus")
print(toyota_car.model)
#メソッドだけでなくクラス変数も.で呼び出せる
#実行結果:Lexus

tesla_car = TeslaCar("modelS")
print(tesla_car.model)
#実行結果:modelS

superによる親のメソッドの呼び出し

親クラスの要請

使い所

class TeslaCar(Car)のinitがclass Car(object)のinitを上書きしてしまう為、同じコードを書く必要がある

qiita.py
class Car(object):
    def __init__(self,model=None):
        #ベースクラスは何も設定しない
        self.model = model

    def run(self):
        print("run")

class ToyotaCar(Car):
    def run(self):
        print("toyta_run")

class TeslaCar(Car):
    def __init__(self, model= "ModelS", enable_auto_run=False):
        self.model = model
        self.enable_auto_run=enable_auto_run

    def run(self):
        print("tesla_run")

使用例

sueperを用いることで親クラスのinitを呼び出すことが可能になる

qiita.py
class Car(object):
    def __init__(self,model=None):
        #ベースクラスは何も設定しない
        self.model = model

    def run(self):
        print("run")

class ToyotaCar(Car):
    def run(self):
        print("toyta_run")

class TeslaCar(Car):
    def __init__(self, model= "ModelS", enable_auto_run=False):
        # self.model = model
        # 同じ処理を避ける
        super().__init__(model)
        self.enable_auto_run=enable_auto_run

    def run(self):
        print("tesla_run")