Python

【Python】第5章第6回:ポリモーフィズム(多態性)の基礎

本記事では、Pythonのオブジェクト指向プログラミングにおける重要な概念「ポリモーフィズム」について詳しく解説します。これを理解することで、コードの柔軟性と拡張性を高めることができます。

0. 記事の概要

この記事を読むメリット

  • ポリモーフィズムの基本を理解:異なるクラス間での一貫性のある操作を学べます。
  • コード設計力の向上:柔軟なプログラムを構築する方法を習得できます。
  • 実践力の習得:ポリモーフィズムを活用した効率的なコードを書く力を身につけます。

この記事で学べること

  • ポリモーフィズムの基本概念と仕組み
  • Pythonにおけるポリモーフィズムの実装例
  • 実践的な活用方法と注意点

1. ポリモーフィズムとは?

1.1 定義

ポリモーフィズム(多態性)とは、異なるクラスのオブジェクトが、同じインターフェースを通じて操作できる仕組みを指します。

1.2 ポリモーフィズムのメリット

  • コードの一貫性を保つ
  • 拡張性が高く、柔軟な設計が可能
  • 複数のオブジェクトを一つの操作で扱える

2. ポリモーフィズムの活用例

2.1 基本的な例

# ポリモーフィズムの基本例
class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "ワンワン"

class Cat(Animal):
    def speak(self):
        return "ニャー"

animals = [Dog(), Cat()]

for animal in animals:
    print(animal.speak())
# 出力:
# ワンワン
# ニャー
動作解説
  1. Animalクラスを基底クラスとして、DogCatがそれぞれ独自のspeakメソッドを定義しています。
  2. リストanimals内のオブジェクトは、Animalクラスを介して一貫性のある操作が可能です。

2.2 実践例:形状クラスの利用

# Shapeクラスの実装例
class Shape:
    def area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

shapes = [Circle(5), Rectangle(4, 6)]

for shape in shapes:
    print(shape.area())
# 出力:
# 78.5
# 24
動作解説
  1. Shapeクラスを基底クラスとして、CircleRectangleがそれぞれareaメソッドを実装しています。
  2. リストshapes内のオブジェクトに対して、同じareaメソッドを呼び出して計算を行います。

3. ポリモーフィズムの注意点

  • 基底クラスのメソッドをオーバーライドする際、意図した動作が行われるように注意する
  • 多態性を意識した設計を行い、共通のインターフェースを定義する

4. 練習問題

以下の課題に挑戦してみましょう。

  1. 「Vehicle」という基底クラスを作成し、moveメソッドを定義してください。
  2. CarBikeというクラスを作成し、moveメソッドをオーバーライドしてください。

5. 練習問題の解答と解説

問1の解答例

# Vehicleクラス
class Vehicle:
    def move(self):
        pass

問2の解答例

# CarとBikeクラス
class Car(Vehicle):
    def move(self):
        return "車が走ります"

class Bike(Vehicle):
    def move(self):
        return "バイクが走ります"

vehicles = [Car(), Bike()]

for vehicle in vehicles:
    print(vehicle.move())
# 出力:
# 車が走ります
# バイクが走ります

6. まとめ

ポリモーフィズムは、異なるオブジェクトを共通のインターフェースで操作する強力な手法です。練習問題を通じて、ポリモーフィズムを実践的に学びましょう。