Python 抽象クラス

ちょっと気になったので調べてみてわかったことを忘れないように書き留めておきます。もしかしたら間違っているところがあるかもしれません。そのうえで読んでください。

抽象クラスとはなにか

Pythonにおける抽象クラスは、abc(Abstract Base Classes)モジュールを使用して定義できます。抽象クラスは、そのクラス自体から直接オブジェクトを作成することはできず、サブクラスで実装されるメソッドや属性を定義するための基本的な設計要素です。

なんのために抽象クラスを定義するのか

抽象クラスは、共通の振る舞いを持つクラスの基盤を提供し、それを継承することで具体的な実装を行うことを促します。これにより、コードの再利用性やメンテナンス性が向上し、プログラム全体の設計を効果的に行うことができます。

もう少し簡単に(?)柔らかく説明すると…
抽象クラスは一番大元の(基盤となる)クラス。しかし情報があいまいになるのでインスタンス化できないようにして、ほかのクラスとして継承させ情報をある程度増やした状態(オーバーライドする)にしてからインスタンス化するみたいな感じでしょうか…?
とりあえずなんとなく理解できなくても大丈夫です。実際のコードを見てみましょう。

from abc import ABC, abstractmethod

# 抽象クラスの定義
class Shape(ABC):  # ABC を継承して抽象クラスを作成
    def __init__(self, name):
        self.name = name

    @abstractmethod         # 抽象メソッド(メソッドの宣言のみで実装なし)
    def area(self):
        print("pass")

    def description(self):  # 実装を持ったメソッド 
        return f"This is a {self.name}."

# Shape クラスを継承した具象クラスの例
class Circle(Shape):
    def __init__(self, radius):
        super().__init__('circle')
        self.radius = radius

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

# Circle クラスを使ってオブジェクトを作成
circle = Circle(5)
print(circle.description())  # description メソッドを呼び出し
# 出力結果 This is a circle.
print("Area:", circle.area())  # area メソッドを呼び出し
# 出力結果Area: 78.5

試しにShapeクラスをインスタンス化しようとしてみると
TypeError: Can't instantiate abstract class Shape with abstract method area
とエラーが出ます。
上記のコードではCircleクラスがShapeクラスを継承し、抽象メソッドareaをオーバライドすることで実装を持ったメソッドにしています。

抽象メソッドとは?

いきなり新しい用語が出てきたので説明します。抽象クラスはオーバライドしないと使えない、実装を持たない抽象メソッドと、オーバライドしなくても使える具体メソッドの両方を持つことができます。抽象メソッドは@abstractmethodで定義できます。@abstractmethodがついていないdescriptionメソッドはCircleでオーバライドしていませんが、エラーは起きていませんよね。試しにdescriptionをつけてみてください。
Can't instantiate abstract class Circle with abstract method description
(抽象メソッド記述のある抽象クラスCircleをインスタンス化できな)と出てしまいます。これはCircleクラスの持つメソッドに抽象メソッドが含まれているためです。

だいぶ雑な説明になってしまいましたが抽象クラスについて説明しました。まだ100%理解できているわけではないのでもう少し勉強しようと思います。
最後まで見ていただいてありがとうございました。

この記事が気に入ったらサポートをしてみませんか?