ポリモーフィズム

Pythonにおける**ポリモーフィズム(多態性)とは、異なるクラスのオブジェクトに対して同じインターフェース(メソッドや操作)**を使用できるという、オブジェクト指向プログラミングの重要な概念の一つです。これにより、コードの柔軟性と再利用性が大幅に向上します。


1. ポリモーフィズムの基本的な考え方

ポリモーフィズムは、以下のように分類できます:

  • コンパイル時ポリモーフィズム(静的):関数オーバーロード、演算子オーバーロード(Pythonは一部のみ対応)

  • 実行時ポリモーフィズム(動的):サブクラスでのメソッドオーバーライドによって、同じメソッド名でも異なる動作をさせる

Pythonでは実行時ポリモーフィズムが主に使用されます。


2. 実行時ポリモーフィズムの例

以下の例では、speak()という同じ名前のメソッドを持つ異なるクラスを定義し、それらを同じ方法で呼び出しています。

python
class Dog: def speak(self): return "ワンワン" class Cat: def speak(self): return "ニャー" def animal_sound(animal): print(animal.speak()) dog = Dog() cat = Cat() animal_sound(dog) # ワンワン animal_sound(cat) # ニャー

このように、関数animal_soundは引数としてどのクラスのオブジェクトを受け取るかを意識せずに、speak()メソッドを実行できます。これはポリモーフィズムによる柔軟性の一例です。


3. 継承との関係

ポリモーフィズムはしばしば継承と組み合わせて使われます。親クラスで定義したメソッドを子クラスでオーバーライドし、それを統一されたインターフェースで扱うことで実現します。

python
class Animal: def speak(self): raise NotImplementedError("サブクラスでオーバーライドしてください") class Dog(Animal): def speak(self): return "ワンワン" class Cat(Animal): def speak(self): return "ニャー"

このようにして、Animal型の変数にDogCatのインスタンスを代入し、共通のinterfaceで扱えるようになります。


4. Pythonのダックタイピングとポリモーフィズム

Pythonでは「ダックタイピング」という動的型付けの特性により、クラスの継承関係がなくても同じ名前のメソッドを持っていればポリモーフィズムが成立します。

python
class Bird: def speak(self): return "チュンチュン" class Robot: def speak(self): return "ピーピー" for entity in [Bird(), Robot()]: print(entity.speak())

これは「アヒルのように鳴き、アヒルのように歩くなら、それはアヒルである」という考えに由来しています。


まとめ

特徴 内容
概念 同じ操作で異なる型のオブジェクトを扱える
メリット 柔軟性、拡張性、コードの再利用性の向上
実現手段 メソッドオーバーライド、ダックタイピング
よく使われる場面 共通の処理を抽象化して複数のクラスで使うとき

生成日:2025/05/03