Pythonのポリモーフィズムとは?オーバーライドとオーバーロードの違いを初心者向けに解説
生徒
「先生、ポリモーフィズムってなんですか?名前がむずかしくて覚えられません…」
先生
「ポリモーフィズムは日本語で言うと『多態性』のことです。同じ名前のメソッドでも、クラスごとにちがう動きをさせられるしくみです。」
生徒
「同じ名前なのに、動きがちがうんですか?なんだか不思議ですね!」
先生
「そうですね、たとえば“走る”という言葉でも、人・動物・ロボットで走り方がちがうのと同じです。では詳しく見ていきましょう!」
1. ポリモーフィズムとは?
Python(パイソン)のオブジェクト指向プログラミングでは、ポリモーフィズム(polymorphism)はとても重要な考え方です。ポリモーフィズムとは、「同じ名前のメソッド(関数)を、ちがうクラスで使っても、それぞれのクラスに合った動きをするしくみ」です。
たとえば、「動物」というクラスと、「犬」「猫」というクラスがあるとします。「鳴く」というメソッドは同じ名前でも、犬と猫で中身がちがっていてよい、というのがポリモーフィズムの考え方です。
2. メソッドのオーバーライドとは?
オーバーライド(Override)とは、「親クラスで定義されたメソッドを、子クラスで上書きして使うこと」です。これにより、ポリモーフィズムが実現されます。
class Animal:
def speak(self):
print("なにかが鳴いています")
class Dog(Animal):
def speak(self):
print("ワンワン")
class Cat(Animal):
def speak(self):
print("ニャーニャー")
animals = [Dog(), Cat()]
for a in animals:
a.speak()
ワンワン
ニャーニャー
このように、親クラスのspeakメソッドを、子クラスで上書き(オーバーライド)して、それぞれの鳴き声を出しています。これがポリモーフィズムです。
3. オーバーロードとの違いとは?
オーバーロード(Overload)とは、「同じ名前のメソッドで、引数の数や型(かたち)を変えて、複数のバージョンを定義すること」です。
ただし、Pythonではオーバーロードはサポートされていません。Pythonでは、関数名が同じであっても、あとから定義されたものが上書きされます。
def greet():
print("こんにちは")
def greet(name):
print(f"こんにちは、{name}さん")
greet()
TypeError: greet() missing 1 required positional argument: 'name'
このように、最初に書いたgreet()は上書きされて消えてしまいます。
4. オーバーロードを実現するには?
Pythonでオーバーロード風の動きをさせたい場合は、*argsやNoneなどを使って、引数の数によって処理を分ける方法があります。
def greet(name=None):
if name:
print(f"こんにちは、{name}さん")
else:
print("こんにちは")
greet()
greet("さくら")
こんにちは
こんにちは、さくらさん
このようにnameに値があるかどうかで、あいさつの文を変えています。
5. ポリモーフィズムのメリットとは?
ポリモーフィズムには、以下のようなメリットがあります:
- 共通のインターフェースで扱えるため、コードがシンプルになる
- 拡張しやすく、新しいクラスを追加しても既存コードを変更しなくてよい
- 現実世界の「多様性」に近い考え方ができる
6. ポリモーフィズムを身近な例でたとえてみよう
ポリモーフィズムは、たとえば「リモコンのボタンを押す」と考えてみましょう。
テレビ、エアコン、照明、それぞれの「電源」ボタンは同じ見た目ですが、押したときの動きはそれぞれちがいます。テレビは画面がつき、エアコンは風が出て、照明は光ります。
つまり「同じ操作(メソッド名)で、ちがう動き(中身)」になるのがポリモーフィズムです。
7. 抽象クラスとポリモーフィズムの関係
ポリモーフィズムを活かすために、「抽象クラス(ちゅうしょうクラス)」を使うこともあります。抽象クラスとは、「中身が決まっていないけど、こういうメソッドはあるよ」という約束だけ決めるクラスです。
Pythonではabcモジュールを使って抽象クラスを定義できます。
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
このように書くと、speakを実装しないと使えないクラスになります。これは「設計ミス」を防ぐのに役立ちます。
8. まとめると?
ポリモーフィズムはオブジェクト指向プログラミングの中でもとても重要な概念です。「同じメソッド名で中身を変える」しくみによって、柔軟で拡張性のあるコードが書けるようになります。
Pythonではオーバーライドによってポリモーフィズムを実現し、オーバーロードは明示的にはサポートされていませんが、工夫すれば似たような動きも可能です。