Pythonはポリモーフィズム(多態性)をサポートしている?基本概念と実装例を解説
はい、Pythonはポリモーフィズム(多態性)をサポートしています。
「ポリモーフィズム」という言葉は、直訳すると「多くの形を持つこと」を意味します。オブジェクト指向プログラミングにおいては、同じインターフェース(メソッド名)でありながら、オブジェクトによって異なる動作を実現できる仕組みのことを指します。
Pythonにおいてポリモーフィズムは、クラス定義における重要な機能の一つです。複数のクラスやサブクラスに共通の名前を持つメソッドが存在する場合に活用されます。
また、ポリモーフィズムは継承を通じて実現することもできます。サブクラスは基底クラスのメソッドをそのまま利用できるだけでなく、必要に応じて上書き(オーバーライド)して独自の振る舞いを定義できます。
ポリモーフィズムの2つの種類
- オーバーロード(Overloading)
- オーバーライド(Overriding)
オーバーロードとは
オーバーロードとは、同一のクラス内に、メソッド名は同じでもパラメータ(引数)が異なる複数のメソッドを定義することです。呼び出し時に渡す引数によって、適切な処理が選択されます。
なお、JavaやC++のような言語と異なり、Pythonでは同名メソッドによる伝統的なオーバーロードは直接サポートされていません。その代わり、デフォルト引数や可変長引数(*args、**kwargs)を活用することで、同様の挙動を実現するのが一般的です。
オーバーライドとは
オーバーライドとは、メソッド名とパラメータ(いわゆるメソッドシグネチャ)が完全に同じ2つのメソッドが存在し、一方が親クラスに、もう一方が子クラスに定義されている状態を指します。この場合、子クラスのインスタンスから呼び出されるのは、子クラス側で定義されたメソッドです。
サンプルコード
ここでは、「魚(Fish)」クラスと「クマノミ(Clownfish)」クラスを例に、同じメソッド名でありながらクラスごとに異なる出力を行うポリモーフィズムの挙動を確認します。
class Fish():
def swim(self):
print("魚が泳いでいます。")
def swim_backwards(self):
print("魚は後ろ向きに泳げますが、後ろ向きに沈むこともあります。")
def skeleton(self):
print("魚の骨格は軟骨でできています。")
class Clownfish():
def swim(self):
print("クマノミが泳いでいます。")
def swim_backwards(self):
print("クマノミは後ろ向きに泳ぐことができます。")
def skeleton(self):
print("クマノミの骨格は硬骨でできています。")
a = Fish()
a.skeleton()
b = Clownfish()
b.skeleton()
このプログラムを python polymorphism.py コマンドで実行すると、以下の出力が得られます。
実行結果
魚の骨格は軟骨でできています。 クマノミの骨格は硬骨でできています。
このように、skeleton() という同じメソッド名を呼び出しても、インスタンスが属するクラスが異なることで、それぞれ別の結果が出力されます。これこそがポリモーフィズムの典型的な例です。
なお、Pythonでは継承関係になくても、同じ名前のメソッドを持つオブジェクトを同じように扱える「ダックタイピング」という柔軟な仕組みも備えており、これもPythonらしいポリモーフィズムの実現方法として広く活用されています。
-
Pythonのclassmethod(クラスメソッド)とは?使い方とコード例を解説
Pythonのclassmethod(クラスメソッド)とは クラスメソッドは、第一引数としてクラス自身を受け取る特殊なメソッドです。この仕組みにより、クラスからインスタンス(オブジェクト)を生成しなくても、クラスに属するメソッドを直接呼び出すことができます。 使い方は非常にシンプルで、クラス内のメソッド宣言の直前にデコレータ @classmethod を付けるだけです。こうすることで、そのメソッドに直接アクセスできるようになります。 クラスメソッドの主な特徴は以下の通りです。 クラスメソッドはクラスに紐付けられており、利用するためにクラスのインスタンス化に依存しません。 クラスメソッドからク
-
Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説
本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(