Pythonのポリモーフィズムとは?オーバーライドとオーバーロードの違いを初心者向けに徹底解説
生徒
「Pythonのオブジェクト指向で、ポリモーフィズムって言葉を見たんですが、正直よくわかりません…」
先生
「ポリモーフィズムは、同じ呼び出し方なのに、動きが変わる仕組みのことです。身近な例で考えると理解しやすいですよ。」
生徒
「同じ呼び出し方で動きが変わる…?ますます気になります。」
先生
「では、Pythonのポリモーフィズムと、オーバーライド・オーバーロードの違いを順番に見ていきましょう。」
1. ポリモーフィズムとは何か
ポリモーフィズムとは、日本語では「多態性」と呼ばれ、同じ名前の処理でも、状況によって振る舞いが変わる仕組みを指します。難しく聞こえますが、リモコンのボタンを押すと、テレビでは映像が変わり、エアコンでは温度が変わる、というイメージに近いです。
Pythonでは、オブジェクト指向の考え方の中で、このポリモーフィズムが自然に使えるようになっています。初心者の方は「同じメソッド名なのに、クラスごとに処理内容が違う」と覚えておくと十分です。
2. Pythonでポリモーフィズムが重要な理由
ポリモーフィズムを使うと、プログラムが読みやすく、修正しやすくなります。同じ呼び方で処理できるため、細かい条件分岐をたくさん書く必要がなくなります。
特にPythonでは、型を厳密に指定しなくても動くため、ポリモーフィズムの考え方がとても自然に使われています。これは初心者にとっても、書きやすく理解しやすい特徴です。
3. オーバーライドとは何か
オーバーライドとは、親クラスで定義されたメソッドを、子クラスで上書きして使うことです。同じメソッド名でも、子クラス専用の処理に変えることができます。
class Animal:
def speak(self):
print("鳴き声を出します")
class Dog(Animal):
def speak(self):
print("ワンワン")
animal = Animal()
dog = Dog()
animal.speak()
dog.speak()
鳴き声を出します
ワンワン
同じ speak メソッドを呼び出しているのに、クラスによって表示が変わっています。これがオーバーライドによるポリモーフィズムです。
4. オーバーライドが使われる場面
オーバーライドは、「共通のルールは同じだが、細かい動きは違う」場合によく使われます。例えば、乗り物という共通の概念があり、車と自転車で動き方が違う、といった場面です。
class Vehicle:
def move(self):
print("移動します")
class Car(Vehicle):
def move(self):
print("エンジンで走ります")
class Bicycle(Vehicle):
def move(self):
print("ペダルをこいで進みます")
vehicles = [Car(), Bicycle()]
for v in vehicles:
v.move()
エンジンで走ります
ペダルをこいで進みます
このように、同じ move を呼んでも、それぞれに合った動きになります。
5. オーバーロードとは何か
オーバーロードとは、同じメソッド名で、引数の数や種類を変えて複数の処理を定義することです。Javaなどの言語では一般的ですが、Pythonでは少し事情が異なります。
Pythonでは、明確なオーバーロードの仕組みは用意されていません。その代わり、引数に初期値を設定したり、条件分岐で処理を分ける方法がよく使われます。
6. Pythonでオーバーロード風の処理を書く方法
Pythonでは、引数の有無によって動きを変えることで、オーバーロードに似た動作を実現できます。
def greet(name=None):
if name is None:
print("こんにちは")
else:
print(f"{name}さん、こんにちは")
greet()
greet("田中")
こんにちは
田中さん、こんにちは
同じ関数名でも、渡す情報によって結果が変わる点がポイントです。
7. オーバーライドとオーバーロードの違い
オーバーライドは、クラスの継承が前提で、親クラスのメソッドを子クラスで上書きします。一方、オーバーロードは、同じ名前で引数違いの処理を使い分ける考え方です。
Pythonでは、オーバーライドは頻繁に使われますが、オーバーロードは別の書き方で表現するのが一般的です。この違いを理解しておくと、他の言語を学ぶときにも役立ちます。
8. 初心者がつまずきやすいポイント
初心者の方は、「同じメソッド名なのに結果が違う」ことに不安を感じやすいですが、ポリモーフィズムは意図的にそう設計されています。
まずは「同じ操作でも、中身はクラスごとに違っていい」という考え方に慣れることが大切です。細かい仕組みは、使いながら自然と理解できるようになります。