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