Pythonは動的型づけというゆるい感じの片付けなので、サブクラスにメソッド実装を強制するような作りが(言語仕様としては)できないが、abcモジュールを使うことで抽象クラス・抽象メソッドを作成することができる。
抽象クラスは、metaclassにabc.ABCMetaを指定して作成し、抽象メソッドには@abstractmethodデコレータを指定する。
from abc import ABCMeta, abstractmethod
class Shape(metaclass=ABCMeta):
@abstractmethod
def area(self):
pass
具象クラスは、普通にスーパークラスに指定して作成する。
class Circle(Shape):
def __init__(self, r):
self.r = r
def area(self):
return pi * self.r ** 2
c = Circle(10)
c.area()
areaメソッドは、抽象メソッドになっているので実装しない場合には、インスタンス生成時にTypeErrorが発生する。
TypeError: Can't instantiate abstract class Circle with abstract methods area
エラーが発生するのは、インスタンス生成時でclassを定義した時点では発生しないので注意が必要。
29.7. abc — 抽象基底クラス — Python 3.4.3 ドキュメント