はじめに
Pythonの標準モジュールであるabc
(abstract base class)を使うと抽象クラスを利用することができます。
環境
- Ubuntu20.04
- Python3.8.10
使い方
抽象クラスを定義
animal.py
# 1. モジュールをインポート
from abc import ABC, abstractmethod
# 2. ABCクラスを継承
class Animal(ABC):
# 3. デコレータで抽象メソッドであることを宣言
@abstractmethod
def cry(self):
pass
まずは冒頭でabcモジュールからABCクラス・abstractmethodデコレータをインポートします。
クラスの定義時にABCクラスを継承することで抽象クラスとして定義できます。
class Animal(ABC):
以下のような書き方も可能です。
class Animal(metaclass=ABCMeta):
@abstractデコレータをメソッドにつけると抽象メソッドであることが示されます。
抽象メソッドにも具体的な処理を記述することはできますが、抽象メソッドであることを明示するためには何も書かないのが望ましいでしょう。
継承先クラスを実装
先ほど定義したAnimalクラスを継承したクラスを実装します。
cat.py
# 抽象クラスをインポート
from animal import Animal
# 抽象クラスを継承
class Cat(Animal):
def __init__(self, name: str):
self.name: str = name
# 抽象メソッドを実装
def cry(self):
print('にゃーん')
# Animal型のオブジェクトとしてcatを宣言
cat: Animal = Cat("ハチワレ")
cat.cry()
cat.pyを実行します。
$ python3 cat.py
にゃーん
正常に実行することができました。
Animalクラスで定義されているcryメソッドを実装しない場合はどうなるでしょうか。
dog.py
# 抽象クラスをインポート
from animal import Animal
# 抽象クラスを継承
class Dog(Animal):
def __init__(self, name: str) ->None:
self.name: str = name
# 抽象メソッドを定義しない
dog: Dog = Dog("ポチ")
このdog.pyを実行してみます。
$ python3 dog.py
Traceback (most recent call last):
File "dog.py", line 9, in <module>
dog: Animal = Dog("ポチ")
TypeError: Can't instantiate abstract class Dog with abstract methods cry
Animalクラスで定義したcryメソッドを実装していないとエラーになります。
このように、抽象クラスを使えば継承先のクラスにメソッドを実装するように強制することができます。実装漏れや同じようなクラスで振る舞いが異なるという事態を事前に回避するのに役立ちます。