抽象クラスとインターフェース

抽象メソッドの定義方法

前のレッスンで、Pythonの抽象クラスを作るには「@abstractmethodデコレーター」を使うんだって話したよね。今回は、この抽象メソッドの「定義方法」について、もう少し詳しく見ていこう。

抽象メソッドは、その名前の通り「抽象的」なメソッドで、メソッドの中身(どんな動きをするのか)は書かないんだ。ただ、「このメソッドは存在するよ、でも中身はまだ決まってないよ」ということを示すだけなんだ。

定義方法はとってもシンプルだよ。


# abcモジュールからabstractmethodをインポートするよ
from abc import ABC, abstractmethod

class Shape(ABC): # 抽象クラスだよ
    # これが抽象メソッドの定義だよ
    @abstractmethod
    def calculate_area(self):
        # メソッドの中身は何も書かないで、「pass」とだけ書くんだ
        pass

# Shapeクラスを継承するCircleクラス
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    # 抽象メソッドであるcalculate_areaを必ずここで実装するよ
    def calculate_area(self):
        return 3.14 * self.radius * self.radius # 円の面積の計算式

# Shapeクラスを継承するRectangleクラス
class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    # 抽象メソッドであるcalculate_areaを必ずここで実装するよ
    def calculate_area(self):
        return self.width * self.height # 四角形の面積の計算式

circle = Circle(5)
print(f"円の面積: {circle.calculate_area()}") # 出力: 円の面積: 78.5

rectangle = Rectangle(4, 6)
print(f"四角形の面積: {rectangle.calculate_area()}") # 出力: 四角形の面積: 24

Shapeクラスでは、calculate_areaメソッドの上に@abstractmethodと書いて、その中身をpassにしているよね。これは、「このShapeクラスから直接インスタンスは作れないよ。そして、このクラスを継承するクラスは、必ずcalculate_areaというメソッドを、それぞれの形で完成させてね!」という強いルールを表しているんだ。

CircleクラスやRectangleクラスは、それぞれ自分の形に合わせた面積の計算方法をcalculate_areaメソッドの中に書いているのが分かるかな?

このように、抽象メソッドを使うことで、プログラムに「必ずこの機能は実装してほしい」というルールを組み込むことができるんだ。これは、大きなプログラムを作る時に、みんなが同じ約束でコードを書くために、とっても役立つんだよ!