Python 速習チュートリアル

Python のポリモーフィズム

1. ポリモーフィズム (Polymorphism)

「ポリモーフィズム(多態性)」という言葉は「多くの形態」を意味します。プログラミングにおいては、異なるオブジェクトやクラスに対して、同じ名前のメソッド、関数、あるいは演算子を実行できる能力を指します。

2. 関数におけるポリモーフィズム

異なるオブジェクトに対して使用できる Python 関数の典型的な例は len() 関数です。

2.1 文字列 (String)

文字列に対して len() を使用すると、文字数が返されます。

x = "こんにちは、世界!"

print(len(x))

2.2 タプル (Tuple)

タプルに対して len() を使用すると、タプル内のアイテム数が返されます。

mytuple = ("リンゴ", "バナナ", "チェリー")

print(len(mytuple))

2.3 辞書 (Dictionary)

辞書に対して len() を使用すると、辞書内のキーと値のペアの数が返されます。

thisdict = {
  "メーカー": "フォード",
  "モデル": "マスタング",
  "年式": 1964
}

print(len(thisdict))

3. クラスにおけるポリモーフィズム

ポリモーフィズムはクラスメソッドで頻繁に使用されます。異なる複数のクラスが、同じ名前のメソッドを持つことができます。

たとえば、Car(車)、Boat(船)、Plane(飛行機)という3つのクラスがあり、それらすべてが move() というメソッドを持っている場合を考えてみましょう。

# 同じメソッド名を持つ異なるクラス
class Car:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("運転します!")

class Boat:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("航行します!")

class Plane:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("飛行します!")

car1 = Car("フォード", "マスタング")       # Carオブジェクトを作成
boat1 = Boat("イビザ", "ツーリング 20")    # Boatオブジェクトを作成
plane1 = Plane("ボーイング", "747")      # Planeオブジェクトを作成

for x in (car1, boat1, plane1):
  x.move()

最後の for ループに注目してください。ポリモーフィズムのおかげで、3つの異なるクラスすべてに対して同じメソッドを実行することができます。

4. 継承におけるポリモーフィズム

同じ名前のメソッドを持つ子クラス(派生クラス)がある場合はどうでしょうか? そこでもポリモーフィズムを活用できるでしょうか?

答えは「イエス」です。上記の例を利用して Vehicle という親クラス(ベースクラス)を作成し、CarBoatPlaneVehicle の子クラスにしてみましょう。子クラスは親クラスのメソッドを継承しますが、それをオーバーライド(上書き)することも可能です。

# Vehicleクラスを作成し、Car、Boat、Planeをその子クラスにする
class Vehicle:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("移動します!")

class Car(Vehicle):
  pass # 親クラスのmove()をそのまま継承

class Boat(Vehicle):
  def move(self):
    print("航行します!") # 親クラスをオーバーライド

class Plane(Vehicle):
  def move(self):
    print("飛行します!") # 親クラスをオーバーライド

car1 = Car("フォード", "マスタング")
boat1 = Boat("イビザ", "ツーリング 20")
plane1 = Plane("ボーイング", "747")

for x in (car1, boat1, plane1):
  print(x.brand)
  print(x.model)
  x.move()

子クラスは親クラスからプロパティとメソッドを継承します。

上記の例では、Car クラスの中身は空(pass)ですが、Vehicle から brandmodel、そして move() を継承しています。
BoatPlane も同様に brandmodelmove() を継承していますが、両者とも move() メソッドをオーバーライドして独自の動作を定義しています。

ポリモーフィズムにより、これらすべてのクラスに対して、クラスの種類を個別に意識することなく共通のメソッドを実行できるのです。