オーバーライド
親クラスにあるメソッドと同じメソッドを子クラスで定義すると、メソッドを上乗せすることができます。
これを「オーバーライド
」と呼びます。
オーバーライドをすることで、子クラスのインスタンスは親クラスのメソッドではなく、子クラスで定義したメソッドを呼び出すようになります。
from fruit import Fruit
fruit1 = Fruit('りんご', 200)
fruit1.weight = 100
print(fruit1.info())
class FruitPrice:
def __init__(self, name, price):
self.name = name
self.price = price
def info(self):
return self.name + 'は' + str(self.price) + '円です'
from fruit_price import FruitPrice
class Fruit(FruitPrice):
def info(self):
return self.name + 'は' + str(self.price) + '円で' + str(self.weight) + 'gです'
りんごは200円で100gです
上記のように、子クラスのインスタンスは子クラスで定義したメソッドを優先して呼び出すようになっています。
なので、親クラスであるFruitPrice
のinfo
メソッドではなく、子クラスであるFruit
のinfo
メソッドが呼び出されました。
よって、親クラスと子クラスで同名のメソッドがある場合は、メソッドが上乗せされます。
###同様に__init__もオーバーライドすることができる
from fruit import Fruit
fruit1 = Fruit('りんご', 200, 100)
# fruit1.weight = 100 この行を削除し、Fruitの引数に追加
print(fruit1.info())
class FruitPrice:
def __init__(self, name, price):
self.name = name
self.price = price
def info(self):
return self.name + 'は' + str(self.price) + '円です'
from fruit_price import FruitPrice
class Fruit(FruitPrice):
def __init__(self, name, price, weight): # 子クラスに__init__メソッドを定義
self.name = name
self.price = price
self.weight = weight # weightが自動で追加されるように記述を追加
def info(self):
return self.name + 'は' + str(self.price) + '円で' + str(self.weight) + 'gです'
りんごは200円で100gです
上記のように記述することで、__init__もオーバーライドすることができました。
しかし現状だと__init__メソッド内のself.name = name
とself.price = price
が重複してしまっています。そこで、重複している部分をまとめるために「super()
」を用います。
super()
オーバーライドしたメソッドの中でsuper()
を用いることで、親クラスを呼び出すことができます。
「super().メソッド名()
」と記述することで親クラス内に定義されたインスタンスメソッドをそのままそのまま利用することができます。
from fruit import Fruit
fruit1 = Fruit('りんご', 200, 100)
print(fruit1.info())
class FruitPrice:
def __init__(self, name, price):
self.name = name
self.price = price
def info(self):
return self.name + 'は' + str(self.price) + '円です'
from fruit_price import FruitPrice
class Fruit(FruitPrice):
def __init__(self, name, price, weight):
# self.name = name
# self.price = price
super().__init__(name, price) # 重複しているため、上2行を削除し、super()を用いてまとめた
self.weight = weight
def info(self):
return self.name + 'は' + str(self.price) + '円で' + str(self.weight) + 'gです'
りんごは200円で100gです
上記のように記述することで、重複していた記述をまとめることができました。
よって、「super().__init__(name, price)
」は、下記の親クラスの__init__メソッドを利用していることがわかりました。
def __init__(self, name, price):
self.name = name
self.price = price