Pythonで抽象クラスを使用してインターフェースを実装する

スポンサーリンク

Pythonで抽象クラスを使用してインターフェースを実装してみます。

なお、今回はabcモジュールを用います。abcモジュールは、Pythonの標準モジュール・ライブラリとなっていますので、事前にインストールする必要はありません。

■今回の環境(Python)

今回のPythonは、バージョン3.9.16を用いる。(なお、Google Colaboratory(Google Colab)を使用。)

抽象クラスと具象クラスの定義

では、早速抽象クラスを使用してインターフェースを実装するためにコードを書いていきます。

■コード

from abc import ABC, abstractmethod

# 抽象クラス(インターフェース)の定義
class Animal(ABC):

    @abstractmethod
    def make_sound(self):
        pass

    @abstractmethod
    def move(self):
        pass

# 具象クラスの定義
class Dog(Animal):

    def make_sound(self):
        print("ワンワン!")

    def move(self):
        print("歩く")

class Cat(Animal):

    def make_sound(self):
        print("ニャーニャー!")

    def move(self):
        print("走る")

# メインの実行部分
def main():
    animals = [Dog(), Cat()]

    for animal in animals:
        animal.make_sound()
        animal.move()
        print("------")

if __name__ == '__main__':
    main()

ますは、abcモジュールからABCクラスとabstractmethodデコレータをインポートします。次にAnimalという抽象クラスを定義します。ABCクラスを継承しています。Animalクラス内にはmake_soundとmoveという2つの抽象メソッドがあります。これらのメソッドはサブクラスで実装する必要があります。

次にDogクラスを定義し、Animalクラスを継承します。そしてmake_soundメソッドとmoveメソッドをオーバーライドします。同様に、Catクラスを定義し、Animalクラスを継承します。そしてmake_soundメソッドとmoveメソッドをオーバーライドします。

その後、def文を用いてmain関数を定義します。animalsというリストにDogとCatのインスタンスを格納します。forループを使用して、リスト内の各動物のインスタンスに対して処理を実行します。処理については、make_soundメソッドを呼び出して、動物の音を出力し、moveメソッドを呼び出して、動物の移動方法を表示します。さらに”——“を出力して、各動物の処理が区切られることを示します。

最後にif __name__ == ‘__main__’:を用いてmain関数を実行します。

■実行・検証

このコードセルを保存し、Google Colaboratory上で、セルを実行してみます。

実行してみると、抽象クラスを用いてインターフェースを実装し、サブ(具象)クラスでメソッドをオーバーライドし、各動物の処理が実行され、出力されることを確認できました。この結果より、共通のインターフェースを持つ複数のクラスを扱う際に、一貫性と柔軟性を保つことができることがわかります。

コメント

タイトルとURLをコピーしました