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に向き合う時間を持つことが重要。
明日は「プロパティを使った属性の設定」