2016年3月7日

abc.abstractmethod で抽象クラス

Python は組み込みレベルでは抽象クラス/抽象メソッドという概念を持っていません。
abc というライブラリに、抽象クラスを定義する abc.ABCMeta と、デコレータで抽象メソッドを定義する abc.abstractmethod があります。
本項では、抽象クラスの定義方法について解説します。


以下は、Base という抽象クラスの定義です。Base は抽象メソッドである func() を持っています。

>>> from abc import ABCMeta
>>> from abc import abstractmethod

# Baseを抽象クラスとして定義
>>> class Base(metaclass=ABCMeta):

...     # func()を抽象メソッドとして定義
...     @abstractmethod
...     func(self):
...         pass
...

Base は抽象クラスですので、そのまま実体化しようとすると、エラーになります。
>>> base = Base()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Base with abstract methods func

また、Base を継承したクラスで、抽象メソッドを具体化していない場合も、エラーとなります。
# Baseを継承するクラス。
# 抽象メソッドを具体化していない。
>>> class Derived(Base):
...     pass
...

# 実体化できない
>>> derived = Derived()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Derived with abstract methods func

Base を継承した非抽象クラスを定義するには、抽象メソッドを具体化する必要があります。
# Baseを継承するクラス。
# 抽象メソッドを具体化している。
>>> class Derived(Base):
...     def func(self):
...         print('not abstract')
...

# 実体化可能
>>> derived = Derived()
>>> derived.func()
not abstract

0 件のコメント:

コメントを投稿