見出し画像

Python資格取得への道のり 17日目

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

class Car(object):
   def run(self):
       print('run')

class Toyota(Car):
   def run(self):
       print('fast')

class Nissan(Car):
   def run(self):
       print('super fast')
   def auto_run(self):
       print('auto run')

car = Car()
car.run()
print('#################')
toyota_car = Toyota()
toyota_car.run()
print('#################')
nissan = Nissan()
nissan.run()
nissan.auto_run()

#run
#################
#fast
#################
#super fast
#auto run

Carのrunメソッドでは、出力が「run」でしたが、
それを継承しつつ、ToyotaのrunメソッドやNissanのrunメソッドでは出力する値を変更できる(例としてfastやsuper fastとして)

これがメソッドのオーバーライド。

class Car(object):
   def __init__(self, model=None):
       self.model = model
   def run(self):
       print('run')

class Toyota(Car):
   def run(self):
       print('fast')

class Nissan(Car):
   def run(self):
       print('super fast')
   def auto_run(self):
       print('auto run')

car = Car()
print(car.model)
car.run()
print('#################')
toyota_car = Toyota()
print(toyota_car.model)
toyota_car.run()
print('#################')
nissan = Nissan()
nissan.run()
nissan.auto_run()

#None
#run
#################
#None
#fast
#################
#super fast
#auto run

Carの初期設定に「def __init__(self, model=None):」という形で引数を与え、self.model=modelを定義しました。

ここで「print(car.model)」としても出力は「None」

この内容はもちろんToyotaにも継承されるため、「print(toyota_car.model)」の出力結果は「None」

class Car(object):
   def __init__(self, model=None):
       self.model = model
   def run(self):
       print('run')

class Toyota(Car):
   def run(self):
       print('fast')

class Nissan(Car):
   def run(self):
       print('super fast')
   def auto_run(self):
       print('auto run')

car = Car()
print(car.model)
car.run()
print('#################')
toyota_car = Toyota('Lexus')
print(toyota_car.model)
toyota_car.run()
print('#################')
nissan = Nissan()
nissan.run()
nissan.auto_run()

#None
#run
#################
#Lexus
#fast
#################
#super fast
#auto run

さらに上記では、Toyotaのクラスに「Lexus」という引数を与えた結果、

「print(toyota_car.model)」は「Lexus」となりました。

class Car(object):
   def __init__(self, model=None):
       self.model = model
   def run(self):
       print('run')

class Toyota(Car):
   def run(self):
       print('fast')

class Nissan(Car):
   def __init__(self, model='PAD', enable_auto_run=False):
       #self.model = model
       super().__init__(model)
       self.enable_auto_run = enable_auto_run
   def run(self):
       print('super fast')
   def auto_run(self):
       print('auto run')

car = Car()
print(car.model)
car.run()
print('#################')
toyota_car = Toyota('Lexus')
print(toyota_car.model)
toyota_car.run()
print('#################')
nissan = Nissan('Note')
print(nissan.model)
nissan.run()
nissan.auto_run()

#None
#run
#################
#Lexus
#fast
#################
#Note
#super fast
#auto run

nissanの方にも「nissan = Nissan('Note')」を追加し、「print(nissan.model)」を実行した結果、「Note」が出力されました。

そこでNissanクラスの初期設定(__init__)を変更したい場合はどうなるのか。
上記は__init__を定義して、引数を「self, model='PAD', enable_auto_run=False」という形で入力。
しかしNissanクラスはCarクラスを継承しているので、変数を定義する際に下記内容が両クラスで被ってくる。

self.model = model

また、NisannクラスではCarクラスにはない変数もある。

self.enable_auto_run = enable_auto_run

そのため、「self.model = model」を書かずに設定を変更する方法として、「super」を使用する。これは親のメソッドを呼び出せる。

具体的な方法としては下記です。

#self.model = model
super().__init__(model)
self.enable_auto_run = enable_auto_run

親メソッドを呼び出すsuperを覚えておこう。

今日はここまで。

休日の方が、時間が取れないのが現実。でも1つでも良いのでPythonに向き合う時間を持つことが重要。

明日は「プロパティを使った属性の設定」

いいなと思ったら応援しよう!