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

abcモジュールの使い方

さあ、抽象クラスがどんなものか分かったところで、Pythonで実際に抽象クラスを作る方法を見ていこうね。

Pythonでは、標準で用意されている「abcモジュール」というものを使うと、抽象クラスを作ることができるんだ。abcは「Abstract Base Classes(抽象基底クラス)」の略だよ。

abcモジュールの中にある、「ABCクラス」と「abstractmethodデコレーター」を使うのがポイントだよ。

例を見てみよう。さっき話した動物の「鳴く」という例を、Pythonのコードで書いてみようか。


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

# Animalクラスを抽象クラスにするために、ABCを継承するよ
class Animal(ABC):
    def __init__(self, name):
        self.name = name

    # make_soundメソッドを抽象メソッドにするよ!@abstractmethodをつけるんだ
    @abstractmethod
    def make_sound(self):
        # 抽象メソッドの中身は書かないでね。passと書くか、何もしないんだ。
        pass

    # 抽象クラスでも、普通のメソッドは定義できるよ
    def eat(self):
        print(self.name + "はご飯を食べています。")

# DogクラスはAnimalクラスを継承するよ
class Dog(Animal):
    # 抽象メソッドのmake_soundを必ず実装(中身を書く)する必要があるよ
    def make_sound(self):
        print(self.name + "がワンワン!")

# CatクラスもAnimalクラスを継承するよ
class Cat(Animal):
    # make_soundを実装するよ
    def make_sound(self):
        print(self.name + "がニャーニャー!")

# 抽象クラスからはインスタンスを作れないよ。エラーになるんだ。
# animal = Animal("ななし") # TypeError: Can't instantiate abstract class Animal with abstract method make_sound

doggo = Dog("ポチ")
doggo.make_sound()
doggo.eat()

kitty = Cat("ミケ")
kitty.make_sound()
# 出力:
# ポチがワンワン!
# ポチはご飯を食べています。
# ミケがニャーニャー!

まず、from abc import ABC, abstractmethodで必要なものをインポートするよ。

そして、抽象クラスにしたいクラスの定義で、カッコの中にABCと書くことで、それが抽象クラスであることをPythonに伝えるんだ。さらに、抽象メソッドにしたいメソッドには、その上に@abstractmethodというデコレーターをつけるよ。

こうすると、このAnimalクラスを継承するDogクラスやCatクラスは、必ずmake_soundメソッドを自分たちで完成させなければならない、というルールが守られるんだ。もしmake_soundを書き忘れると、エラーになってしまうからね。

これで、Pythonで抽象クラスを使って、しっかりとしたルールのあるプログラムが作れるようになったね!