LoginSignup
0
1

More than 3 years have passed since last update.

オーバーライド

Last updated at Posted at 2021-04-20

オーバーライド

親クラスにあるメソッドと同じメソッドを子クラスで定義すると、メソッドを上乗せすることができます。
これを「オーバーライド」と呼びます。
オーバーライドをすることで、子クラスのインスタンスは親クラスのメソッドではなく、子クラスで定義したメソッドを呼び出すようになります。

script.py
from fruit import Fruit

fruit1 = Fruit('りんご', 200)
fruit1.weight = 100

print(fruit1.info())
fruit_price.py
class FruitPrice:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def info(self):
        return self.name + 'は' + str(self.price) + '円です'
fruit.py
from fruit_price import FruitPrice

class Fruit(FruitPrice):
    def info(self):
        return self.name + 'は' + str(self.price) + '円で' + str(self.weight) + 'gです'
出力結果
りんごは200円で100gです

上記のように、子クラスのインスタンスは子クラスで定義したメソッドを優先して呼び出すようになっています。
なので、親クラスであるFruitPriceinfoメソッドではなく、子クラスであるFruitinfoメソッドが呼び出されました。
よって、親クラスと子クラスで同名のメソッドがある場合は、メソッドが上乗せされます。

同様に__init__もオーバーライドすることができる

script.py
from fruit import Fruit

fruit1 = Fruit('りんご', 200, 100)
# fruit1.weight = 100 この行を削除し、Fruitの引数に追加

print(fruit1.info())
fruit_price.py
class FruitPrice:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def info(self):
        return self.name + 'は' + str(self.price) + '円です'
fruit.py
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 = nameself.price = priceが重複してしまっています。そこで、重複している部分をまとめるために「super()」を用います。

super()

オーバーライドしたメソッドの中でsuper()を用いることで、親クラスを呼び出すことができます。
super().メソッド名()」と記述することで親クラス内に定義されたインスタンスメソッドをそのままそのまま利用することができます。

script.py
from fruit import Fruit

fruit1 = Fruit('りんご', 200, 100)

print(fruit1.info())
fruit_price.py
class FruitPrice:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def info(self):
        return self.name + 'は' + str(self.price) + '円です'
fruit.py
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__メソッドを利用していることがわかりました。

fruit_price.py
def __init__(self, name, price):
    self.name = name
    self.price = price
0
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1