PYTHON MEBY

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())

関連記事