Pythonのポリモーフィズム(多態性)とは?演算子・組み込み関数・メソッドでの実例付き解説
ポリモーフィズム(多態性)とは「複数の形を持つこと」を意味するオブジェクト指向プログラミングの重要な概念です。Pythonでは、同じ演算子や関数が入力に応じて異なる振る舞いをする様子を、至るところで見ることができます。また、異なるクラスに同名のメソッドを持たせることで、コードの再利用性が高まり、プログラム全体の複雑さを抑えることができます。
さらに、ポリモーフィズムは継承とも密接な関係があります。この記事では、具体的なコード例を通じて、Pythonにおけるポリモーフィズムの基本をわかりやすく解説します。
演算子におけるポリモーフィズム
「+」演算子は、2つの入力を受け取り、その種類に応じて異なる結果を返します。整数同士を足せば整数が、片方でも浮動小数点数が含まれれば結果は浮動小数点数になります。また、文字列に対して使えば単純に連結されます。これは「+」演算子がPython内部でそのように設計されているためで、特別な処理を書かなくても自動的に行われます。
コード例
a = 23 b = 11 c = 9.5 s1 = "Hello" s2 = "There!" print(a + b) print(type(a + b)) print(b + c) print(type(b + c)) print(s1 + s2) print(type(s1 + s2))
上記のコードを実行すると、次のような結果が得られます。
実行結果
34 <class 'int'> 20.5 <class 'float'> HelloThere! <class 'str'>
組み込み関数におけるポリモーフィズム
Pythonの組み込み関数も、引数として受け取るデータ型によって異なる処理を行います。代表的な例がlen()関数です。文字列を渡すと文字数をカウントしますが、タプルや辞書を渡した場合には、それぞれの要素数を数えるという別の処理を行います。
コード例
text = 'Hi There !'
tup = ('Mon','Tue','Wed','Thu','Fri')
lst = ['Jan','Feb','Mar','Apr']
dct = {'1D':'Line','2D':'Triangle','3D':'Sphere'}
print(len(text))
print(len(tup))
print(len(lst))
print(len(dct))上記のコードを実行すると、次のような結果が得られます。
実行結果
10 5 4 3
ユーザー定義メソッドにおけるポリモーフィズム
同名のメソッドを、異なるクラスごとに定義することもできます。呼び出し側は同じメソッド名を使いながら、クラスが違えば異なる結果を得られるのです。次の例では、「長方形(Rectangle)」と「円(Circle)」という2つのクラスを作成し、どちらも同じ名前のperimeter()(周囲の長さ)とarea()(面積)メソッドを持たせています。
コード例
from math import pi
class Rectangle:
def __init__(self, length, breadth):
self.l = length
self.b = breadth
def perimeter(self):
return 2 * (self.l + self.b)
def area(self):
return self.l * self.b
class Circle:
def __init__(self, radius):
self.r = radius
def perimeter(self):
return 2 * pi * self.r
def area(self):
return pi * self.r ** 2
# クラスのインスタンス化
rec = Rectangle(5, 3)
cr = Circle(4)
print("長方形の周囲の長さ: ", rec.perimeter())
print("長方形の面積: ", rec.area())
print("円の周囲の長さ: ", cr.perimeter())
print("円の面積: ", cr.area())上記のコードを実行すると、次のような結果が得られます。
実行結果
長方形の周囲の長さ: 16 長方形の面積: 15 円の周囲の長さ: 25.132741228718345 円の面積: 50.26548245743669
まとめ
このように、Pythonのポリモーフィズムは主に以下の場面で活用できます。
- 演算子: 「+」などがデータ型に応じて加算・連結などを自動的に切り替える
- 組み込み関数: len()などが引数の型に応じて異なる処理を行う
- ユーザー定義メソッド: 異なるクラスに同名のメソッドを定義し、統一的なインターフェースで呼び出す
ポリモーフィズムを理解すると、柔軟で再利用しやすいコードを書けるようになります。特に継承と組み合わせたダックタイピングの活用は、Pythonらしい設計の鍵となるので、ぜひ実際にコードを書いて試してみてください。
-
Pythonで二分木の直径を求める方法【DFSを使った実装解説】
二分木の直径とは二分木が与えられたとき、その木の直径(diameter)を計算することを考えます。二分木の直径とは、木の中の任意の2つのノードをつなぐ最長経路の長さのことです。重要なポイントとして、この経路は必ずしも根(ルート)を通るとは限りません。例えば、次のような木を考えてみましょう。この場合、経路 [4, 2, 1, 3] または [5, 2, 1, 3] の長さが3本の辺で構成されているため、直径は3となります。解法のアプローチこの問題はDFS(深さ優先探索)を使うことで効率的に解くことができます。手順は以下の通りです。DFSで各ノードを訪問しながら直径を求めます。まず答えを格納する変
-
Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説
本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(