Pythonのオーバーライドって何?親クラスのメソッドを書き換える仕組みを理解しよう
こんにちは、とまだです。
みなさん、Pythonでクラスを作っていて「親クラスのメソッドを少しだけ変えたい」と思ったことはありませんか?
今回は現役のエンジニアとしての経験から、オーバーライドという仕組みについて解説します。
この記事を読めば、クラスの継承をもっと柔軟に使えるようになりますよ。
オーバーライドって何?
オーバーライドを一言で表すと「親の行動を子どもが変える」ことです。
たとえば、親が「朝7時に起きる」という習慣を持っていたとします。
でも子どもは「朝6時に起きる」という自分のルールを作る。
これがまさにオーバーライドの考え方です。
プログラミングでは、親クラスのメソッドと同じ名前のメソッドを子クラスで定義します。
すると、子クラスの方が優先されるんです。
なぜオーバーライドが必要?
コードを書いていると、似ているけど少し違う処理がよく出てきます。
たとえば、ECサイトの会員システムを考えてみましょう。
一般会員は5%割引。
プレミアム会員は15%割引。
基本的な計算方法は同じだけど、割引率だけが違う。
こんなとき、すべてを別々に書くのは非効率ですよね。
そこでオーバーライドの出番です。
共通部分は親クラスに任せて、違う部分だけを子クラスで上書きする。
これで無駄のないコードが書けるようになります。
基本的な使い方を見てみよう
それでは実際のコードで確認していきましょう。
まずはシンプルな例から始めます。
class Animal:
def speak(self):
print("何かの鳴き声がします。")
class Dog(Animal):
def speak(self):
print("ワンワン!")
# 実際に使ってみる
dog = Dog()
dog.speak() # ワンワン!と表示される
Animalクラスにはspeakメソッドがあります。
DogクラスはAnimalを継承していますが、同じspeakメソッドを定義しています。
これがオーバーライドです。
dog.speak()を呼ぶと、親クラスではなく子クラスのメソッドが実行されます。
super()を使って親の処理も活用する
でも時には、親クラスの処理も使いたいことがあります。
そんなときはsuper()を使いましょう。
class Animal:
def speak(self):
print("鳴き声の前に深呼吸...")
class Cat(Animal):
def speak(self):
super().speak() # 親クラスのメソッドを呼ぶ
print("ニャー!")
# 使ってみる
cat = Cat()
cat.speak()
実行すると以下のように表示されます。
鳴き声の前に深呼吸...
ニャー!
親クラスの処理を活かしつつ、独自の処理を追加できました。
これは実務でよく使うパターンです。
実務での活用例
現場では、こんな使い方をすることが多いです。
class BaseValidator:
def validate(self, data):
# 基本的なチェック
if not data:
return False
return True
class EmailValidator(BaseValidator):
def validate(self, data):
# まず基本チェックを実行
if not super().validate(data):
return False
# メールアドレス特有のチェックを追加
if "@" not in data:
return False
return True
基本的なバリデーションは親クラスに任せる。
そして、メールアドレス特有のチェックだけを追加する。
このように責任を分担できるのが便利です。
注意したいポイント
オーバーライドは便利ですが、気をつけたい点もあります。
メソッド名は正確に
親クラスのメソッド名と完全に一致させる必要があります。
class Parent:
def calculate_price(self): # priceのつづりに注目
return 100
class Child(Parent):
def calculate_prce(self): # あ、iが抜けてる!
return 200
たった一文字のタイプミスで、まったく別のメソッドになってしまいます。
これだとオーバーライドにならないので注意しましょう。
継承は浅く保つ
継承の階層が深くなりすぎると、どのメソッドが呼ばれるか分かりにくくなります。
親→子→孫→ひ孫...
こんな感じで続くと、デバッグが大変です。
できるだけシンプルな構造を心がけましょう。
オーバーロードとの違い
似た言葉で「オーバーロード」というものがあります。
でも、これはまったく別物です。
オーバーロードは「同じ名前で引数が違うメソッドを複数作る」こと。
オーバーライドは「親のメソッドを子が上書きする」こと。
Pythonには厳密な意味でのオーバーロードはありません。
でもオーバーライドはバリバリ使えます。
この違いを理解しておくと、他の言語を学ぶときにも役立ちます。
実践的な例:料金計算システム
最後に、もう少し実践的な例を見てみましょう。
class Customer:
def calculate_discount(self, price):
# 一般会員は5%割引
return price * 0.95
class PremiumCustomer(Customer):
def calculate_discount(self, price):
# プレミアム会員は15%割引
return price * 0.85
class VIPCustomer(PremiumCustomer):
def calculate_discount(self, price):
# VIP会員は基本15%割引
discounted = super().calculate_discount(price)
# さらに1万円以上なら追加5%割引
if price >= 10000:
discounted *= 0.95
return discounted
一般会員、プレミアム会員、VIP会員。
それぞれ割引率が違います。
でも基本的な計算の流れは同じ。
オーバーライドを使えば、こんな風にきれいに整理できます。
まとめ
オーバーライドは、クラスの継承をより柔軟に使うための仕組みです。
親クラスの良いところは残しつつ、必要な部分だけを変更できる。
まさに「いいとこ取り」ができるんです。
今回紹介したポイントを押さえておけば、基本的な使い方は大丈夫です。
- 親と同じメソッド名で定義する
- super()で親の処理も呼べる
- メソッド名のタイプミスに注意
- 継承階層は浅めに保つ
まずは簡単な例から試してみてください。
実際に手を動かすことで、オーバーライドの便利さが実感できるはずです。
著者について

とまだ
フルスタックエンジニア
Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。
著者の詳細を見る →