Pythonで抽象クラスを理解する5ステップ

Pythonで抽象クラスを理解する5ステップの画像Python
この記事は約8分で読めます。

※本記事のコンテンツは、利用目的を問わずご活用いただけます。実務経験10000時間以上のエンジニアが監修しており、常に解説内容のわかりやすさや記事の品質に注力しておりますので、不具合・分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。(理解できない部分などの個別相談も無償で承っております)
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonプログラミングを学ぶ中で、抽象クラスという概念に出会ったことはありませんか?

あるいは、「抽象クラス」という言葉を耳にしたけど、具体的に何を指すのかわからないという方もいるかもしれません。

そこで、この記事ではPythonで抽象クラスを理解するための5つのステップを紹介します。

初心者でも分かるように詳細なサンプルコードを交えて、抽象クラスの作り方、使い方、応用例を学びましょう。

●抽象クラスとは

抽象クラスとは、プログラミングの世界でよく用いられる概念であり、具体的な実装を持たないメソッド(これを抽象メソッドと呼びます)を定義するためのクラスです。

これは、「形」としての規約を設定し、その「形」を持った別のクラス(具象クラス)が具体的な実装を担当します。

これにより、プログラムの設計が柔軟になり、またコードの再利用性も向上します。

●Pythonでの抽象クラスの作り方

Pythonで抽象クラスを作成するには、まず抽象メソッドを定義し、その後で抽象クラスを宣言します。

○抽象メソッドの定義

Pythonでは、抽象メソッドはabcモジュールのabstractmethodデコレータを使用して定義します。

@abstractmethodデコレータが付与されたメソッドは、抽象メソッドとなり、子クラスでの実装が強制されます。

from abc import ABC, abstractmethod

class AbstractClassExample(ABC):
    @abstractmethod
    def do_something(self):
        pass

このコードではAbstractClassExampleという抽象クラスを作成しています。

この抽象クラスにはdo_somethingという抽象メソッドが定義されており、具体的な実装は含まれていません。

○抽象クラスの宣言

抽象クラスを宣言するには、クラス宣言の際にABCを継承します。

これにより、そのクラスは抽象クラスとなります。既述のサンプルコードがそれに当たります。

●抽象クラスの使い方とサンプルコード

さて、抽象クラスの作り方がわかったところで、実際にどのように使うのか見ていきましょう。

抽象クラスの基本的な使い方と、抽象メソッドの実装について解説します。

○サンプルコード1:抽象クラスの基本的な使い方

抽象クラスは、具体的な処理を持たないメソッド(抽象メソッド)を定義するクラスです。

したがって、抽象クラス自体は直接インスタンス化することはできません。

具体的な実装は、抽象クラスを継承した子クラス(具象クラス)で行います。

下記のコードは、先ほど作成した抽象クラスAbstractClassExampleを継承した具象クラスConcreteClassExampleの例です。

ConcreteClassExampleクラスでは、抽象メソッドdo_somethingが具体的に実装されています。

class ConcreteClassExample(AbstractClassExample):
    def do_something(self):
        super().do_something()
        print("具象クラスで抽象メソッドの処理を実装しています。")

このコードでは、抽象クラスAbstractClassExampleを継承したConcreteClassExampleという具象クラスを作成し、抽象メソッドdo_somethingを実装しています。

super().do_something()を呼び出すことで親クラス(抽象クラス)のメソッドを呼び出しています。

その後、”具象クラスで抽象メソッドの処理を実装しています。”と表示します。

○サンプルコード2:抽象メソッドを実装する

抽象クラスを継承した具象クラスでは、抽象メソッドを必ず実装する必要があります。

これにより、抽象クラスで定義した”形”(メソッド名や引数など)に従って処理を記述することが強制され、コードの統一性が保たれます。

下記のコードでは、do_somethingメソッドの実装を行っています。

class AnotherConcreteClassExample(AbstractClassExample):
    def do_something(self):
        super().do_something()
        print("もう一つの具象クラスで抽象メソッドの処理を実装しています。")

concrete_example = AnotherConcreteClassExample()
concrete_example.do_something()

このコードでは、AbstractClassExampleという抽象クラスを継承したAnotherConcreteClassExampleという具象クラスを作成し、抽象メソッドdo_somethingを実装しています。

具体的には、親クラスのdo_somethingメソッドを呼び出した後で、”もう一つの具象クラスで抽象メソッドの処理を実装しています。”と表示します。

最後の行では、具象クラスのインスタンスを作成し、do_somethingメソッドを呼び出しています。

これを実行すると、画面には”もう一つの具象クラスで抽象メソッドの処理を実装しています。”と表示されます。

●抽象クラスの応用例とサンプルコード

抽象クラスは、一つ以上の抽象メソッドを持つことが可能です。

また、抽象クラスを継承した具象クラスでは、抽象クラスで定義した全ての抽象メソッドを実装する必要があります。

次に、この応用例について見ていきましょう。

○サンプルコード3:複数の抽象メソッドを持つ抽象クラス

抽象クラスでは、複数の抽象メソッドを定義することが可能です。

下記のコードは、2つの抽象メソッドdo_somethingdo_something_elseを持つ抽象クラスAbstractClassMultipleMethodsの例です。

from abc import ABC, abstractmethod

class AbstractClassMultipleMethods(ABC):
    @abstractmethod
    def do_something(self):
        pass

    @abstractmethod
    def do_something_else(self):
        pass

このコードでは、do_somethingdo_something_elseという2つの抽象メソッドを持つ抽象クラスAbstractClassMultipleMethodsを定義しています。

具象クラスでは、これらの抽象メソッド全てを実装する必要があります。

○サンプルコード4:抽象クラスを継承した具象クラスの作成

それでは、先ほど作成した抽象クラスAbstractClassMultipleMethodsを継承した具象クラスConcreteClassMultipleMethodsを作成し、全ての抽象メソッドを実装してみましょう。

class ConcreteClassMultipleMethods(AbstractClassMultipleMethods):
    def do_something(self):
        print("具象クラスでdo_somethingメソッドを実装しています。")

    def do_something_else(self):
        print("具象クラスでdo_something_elseメソッドを実装しています。")

concrete_example = ConcreteClassMultipleMethods()
concrete_example.do_something()
concrete_example.do_something_else()

このコードでは、抽象クラスAbstractClassMultipleMethodsを継承した具象クラスConcreteClassMultipleMethodsを作成し、2つの抽象メソッドdo_somethingdo_something_elseを実装しています。

具体的には、それぞれのメソッドで”具象クラスでdo_somethingメソッドを実装しています。”と”具象クラスでdo_something_elseメソッドを実装しています。”と表示します。

最後の2行では、具象クラスのインスタンスを作成し、2つのメソッドを呼び出しています。

これを実行すると、それぞれのメソッドで表示したメッセージが表示されます。

●注意点と対処法

Pythonの抽象クラスを使う際には、いくつかの注意点があります。

  1. 抽象クラスはインスタンスを作成することができません。
    抽象クラスを継承した具象クラスを作成し、その具象クラスからインスタンスを作成する必要があります。
  2. 抽象クラスは、その中に一つ以上の抽象メソッドを持つ必要があります。
    具象クラスでは、全ての抽象メソッドを実装しなければなりません。
    もし抽象メソッドを実装しない具象クラスを作成しようとすると、エラーが発生します。

これらの注意点は、抽象クラスと抽象メソッドの役割を理解することで対処することができます。

抽象クラスはインターフェースを定義し、具象クラスはそのインターフェースに従って具体的な処理を実装する、という役割分担を理解しておくことが重要です。

まとめ

以上がPythonの抽象クラスの理解の5ステップになります。

まず抽象クラスとは何か、そしてその使い方を紹介しました。

さらに、抽象クラスを継承した具象クラスの作成方法と、複数の抽象メソッドを持つ抽象クラスの作成方法を解説しました。

最後に、抽象クラスを使う際の注意点とその対処法について解説しました。

抽象クラスは、Pythonを使ったオブジェクト指向プログラミングの一部です。

抽象クラスを理解し、適切に使うことで、より再利用性と拡張性の高いコードを書くことが可能になります。

これらの知識を元に、Pythonプログラミングのスキルをさらに磨いていきましょう。