😊

Python100本ノック#6 オーバーライド(Override)

2023/11/29に公開

オーバーライドとは

単に親クラスを継承するだけでは、子クラスの存在意義はなく親クラスを使えばよい。
継承してさらに独自の特徴を持たせるべきである。
オーバーライドは、親クラスから継承した属性とメソッドを独自のものに作り直すことである。

class Animal(object):
    def eat(self):
        print('i can eat')
    
    def call(self):
        print('i can call')
        
class Dog(Animal):
    pass

class Cat(Animal):
    pass

kotaro = Dog()
kotaro.eat()
kotaro.call()

haru = Cat()
haru.eat()
haru.call()

オーバーライドの用途と実現方法

これだと、AnimalとDogとCatとは同じものになるのでDagとCatを定義する意味はない。
DagとCatに独自の特徴を持たせるようにcall()をオーバーライドする。

class Animal(object):
    def eat(self):
        print('i can eat')
    
    def call(self):
        print('i can call')
        
class Dog(Animal):
    #call()をオーバーライド
    def call(self):
        print('i can woof woof.')

class Cat(Animal):
    #call()をオーバーライド
    def call(self):
        print('i can meow meow.')

kotaro = Dog()
kotaro.eat()
kotaro.call()

haru = Cat()
haru.eat()
haru.call()

output

i can eat
i can woof woof.
i can eat
i can meow meow.

super()を用いた親クラスの属性とメソッドを呼び出し

オーバーライドした後もたまに親クラスの属性とメソッドを使いたい場合はsuper()を活用する。
super(): 親クラスの属性とメソッドを呼び出すためのクラスである。

super().属性名
super().メソッド名

自動車、ガソリン車、ハイブリッド車クラスを例にすると

class Car(object):
    def __init__(self, brand, model, color):
        self.brand = brand
        self.model = model
        self.color = color
     def run(self):
        print('i can run')
        
class GasolineCar(Car):
    def __init__(self, brand, model, color):
        super().__init__(brand, model, color)
        
    def run(self):
        print('i can run with gasoline')
        
class HybridCar(Car):
    def __init__(self, brand, model, color):
        super().__init__(brand, model, color)
        # バッテリー属性
        self.battery = 70
        
    def run(self):
        print(f'i can run with gasoline also electric,remain:{self.battery}')
        
bwm_x5 = GasolineCar('bmw', 'X5', 'White')
bwm_x5.run()

toyota_voxy = HybridCar('Toyota', 'Voxy', 'Black')
toyota_voxy.run()

output

i can run with gasoline
i can run with gasoline also electric,remain:70

Discussion