さあ、抽象クラスがどんなものか分かったところで、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で抽象クラスを使って、しっかりとしたルールのあるプログラムが作れるようになったね!