Skip to content

6.4 メソッドのオーバーライド

新しいクラスは親クラスからすべての機能を継承しますが、子クラスが親クラスとまったく同じ動作しかしないのであれば、わざわざ新しいクラスを作る意味がありません。 子クラスで独自の動作をさせたい場合は、親クラスにあるメソッドと同じ名前のメソッドを子クラス内で定義し直します。これをメソッドの オーバーライド(上書き) と呼びます。

一般的なメソッドのオーバーライド

Section titled “一般的なメソッドのオーバーライド”

前節で作った Car クラスと Yugo クラスの例で見てみましょう。親クラスの exclaim メソッドを、子クラスである Yugo クラスでオーバーライドして動作を変えます。

# 親クラス
class Car():
def exclaim(self):
print("I'm a Car!")
# 子クラス(Carを継承し、exclaimメソッドをオーバーライド)
class Yugo(Car):
def exclaim(self):
print("I'm a Yugo! Much like a Car, but more Yugo-ish.")

それぞれのクラスからオブジェクトを作り、メソッドを呼び出すと、異なる結果が返ってきます。

give_me_a_car = Car()
give_me_a_yugo = Yugo()
give_me_a_car.exclaim()
# 出力: I'm a Car!
give_me_a_yugo.exclaim()
# 出力: I'm a Yugo! Much like a Car, but more Yugo-ish.

__init__() メソッドのオーバーライド

Section titled “__init__() メソッドのオーバーライド”

通常のメソッドだけでなく、オブジェクトの初期化を行う特殊メソッド __init__() もオーバーライドすることができます。

例として、Person(人)クラスを継承し、医者を表す MDPerson クラスと、弁護士を表す JDPerson クラスを作ってみましょう。

# 親クラス
class Person():
def __init__(self, name):
self.name = name
# 子クラス1: 医者
class MDPerson(Person):
def __init__(self, name):
# 名前の前に "Doctor " を追加する
self.name = "Doctor " + name
# 子クラス2: 弁護士
class JDPerson(Person):
def __init__(self, name):
# 名前の後に ", Esquire" を追加する
self.name = name + ", Esquire"

それぞれのクラスからオブジェクトを作成すると、初期化時の処理がクラスごとに異なっていることがわかります。

person = Person('Fudd')
doctor = MDPerson('Fudd')
lawyer = JDPerson('Fudd')
print(person.name)
# 出力: Fudd
print(doctor.name)
# 出力: Doctor Fudd
print(lawyer.name)
# 出力: Fudd, Esquire