😽

Python100本ノック#8 ポリモーフィズム(Polymorphism)

2023/11/30に公開

ポリモーフィズム(Polymorphism)とは

Polymorphism :「多様性、多相性、多態性」という意味。
オブジェクト指向プログラミング(object-oriented programming, OOP)においてポリモフィズムとは同じ操作の呼び出しで、呼び出されたオブジェクトごとに異なる適切な動作を行うことを表す。この状態をプログラムで実現するために、クラスの継承関係やインタフェースとクラスの実装関係が使用される。

duck typing(ダックタイピング)とは

Pythonでは、厳密なポリモーフィズムにこだわらず、ダックタイピングという手法を用いられている。ダックタイピングとは、オブジェクトは期待通りの動作をしてくれるなら、そのオブジェクトの型を気にしなくてもよいというプログラミングの作法である。つまり、「型」より「ふるまい」に注目した考え方である。

ポリモーフィズムがないとなるか

「Fruit」親クラスを継承した「Apple」、「Banana」、「Orange」子クラスからジュースを作る場合は、「Apple」は「Apple juice」用で、「Banana」は「Banana juice」用になる。

class Fruit(object):
    def makejuice(self):
        print('make juice')

class Apple(Fruit):
    def makejuice(self):
        print('make apple juice')

class Banana(Fruit):
    def makejuice(self):
        print('make banana juice')

class Orange(Fruit):
    def makejuice(self):
        print('make orange juice')

apple = Apple()
banana = Banana()
orange = Orange()

# 全果物クラスからmakejuice()を呼ぶ必要がある
apple.makejuice()
banana.makejuice()
orange.makejuice()

output

make apple juice
make banana juice
make orange juice

ポリモーフィズムの具体例

下図のように「Fruit」親クラスを継承した「Apple」、「Banana」、「Orange」子クラスがあるとする。子クラスは当然親クラスのmakejuice()を持っている。異なるフルーツに応じたジュースを出力させたい。Appleの場合はアップルジュース、Bananaの場合はバナナジュースを出すようにする。ここで「インターフェース」のようなものservice()を利用することで実現させる。

class Fruit(object):
    def makejuice(self):
        print('make juice')

class Apple(Fruit):
    def makejuice(self):
        print('make apple juice')

class Banana(Fruit):
    def makejuice(self):
        print('make banana juice')

class Orange(Fruit):
    def makejuice(self):
        print('make orange juice')

#インターフェースのようなメソッドを定義
def service(obj):
    obj.makejuice()

apple = Apple()
banana = Banana()
orange = Orange()

# 全果物クラスからmakejuice()を呼ぶ必要はない。
# オブジェクトに応じて動いてくれる。
for i in (apple, banana, orange):
    service(i)

output

make apple juice
make banana juice
make orange juice

ポリモーフィズムを利用するメリット

コードの再利用性や柔軟性、保守性を高めることができる。

Discussion