Pythonでポリモーフィズムを実装
この記事では、Pythonにおけるポリモーフィズムの概念と実装方法について解説します。様々な例を通して、ポリモーフィズムがコードをどのように簡潔で拡張可能にするか理解を深めます。
目次
ポリモーフィズムとは?
ポリモーフィズム(多態性)とは、異なるクラスのオブジェクトに対して同じ名前のメソッドを呼び出した際に、それぞれのクラスに合わせた動作を実行できる性質のことです。これにより、コードの柔軟性と拡張性が向上します。例えば、動物を表すクラス群(犬、猫、鳥など)で『鳴く』というメソッドを定義した場合、それぞれの動物クラスで異なる鳴き声を表現できます。これがポリモーフィズムです。
Pythonでのポリモーフィズムの実装例
Pythonでは、ポリモーフィズムを比較的容易に実装できます。最も単純な例として、異なるクラスが同じメソッド名を持つことで実現できます。
class Dog:
def bark(self):
print("ワンワン!")
class Cat:
def bark(self):
print("ニャー!")
animals = [Dog(), Cat()]
for animal in animals:
animal.bark()
上記の例では、DogクラスとCatクラスはどちらもbarkメソッドを持っています。リストanimals内のそれぞれのオブジェクトに対してbarkメソッドを呼び出すと、クラスに応じて異なる出力が得られます。
ダックタイピング
Pythonでは、ダックタイピングという概念が広く用いられます。これは、"もしそれがアヒルのように歩き、アヒルのように鳴き、アヒルのように泳ぐなら、それはアヒルだ"という考え方です。つまり、オブジェクトが特定のメソッドを持っていれば、その型を意識せずにメソッドを呼び出すことができます。
def make_sound(animal):
animal.bark()
make_sound(Dog())
make_sound(Cat())
このmake_sound関数では、引数の型をDogまたはCatに限定していません。引数がbarkメソッドを持っていれば、問題なく実行できます。これがダックタイピングです。
抽象基底クラス(ABC)によるポリモーフィズム
より厳密なポリモーフィズムの実装には、abcモジュールにある抽象基底クラス(ABC)を使用します。ABCは、具体的な実装を持たない、メソッドのシグネチャのみを定義したクラスです。サブクラスは、これらのメソッドを実装する必要があります。
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
print("ワンワン!")
class Cat(Animal):
def make_sound(self):
print("ニャー!")
animals = [Dog(), Cat()]
for animal in animals:
animal.make_sound()
実践例:図形クラス
ポリモーフィズムの応用例として、図形クラスを考えてみましょう。異なる図形(円、正方形など)の面積を計算するメソッドを統一的に呼び出せます。
from abc import ABC, abstractmethod
import math
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius**2
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side**2
shapes = [Circle(5), Square(4)]
for shape in shapes:
print(shape.area())