Python 標準ライブラリ abc 抽象基底クラス
Publish date: 2022-02-11
Python標準のabcクラスを使用すると抽象基底クラスを表現できる。
概要
デコレータ@abstractmethod
をメソッドの一番内側につけることで、
抽象メソッドやプロパティを定義できる。
from abc import ABC, abstractmethod
class SampleABC(ABC):
@abstractmethod
def sample_abstract_method(self):
pass
@classmethod
@abstractmethod
def sample_abstract_classmethod(cls):
pass
@staticmethod
@abstractmethod
def sample_abstract_staticmethod():
pass
@property
@abstractmethod
def sample_abstract_property(self):
pass
@sample_abstract_property.setter
@abstractmethod
def sample_abstract_property(self, val):
pass
@abstractmethod
def _get_prop(self):
pass
@abstractmethod
def _set_prop(self, val):
pass
def _get_prop2(self):
pass
def _set_prop2(self, val):
pass
def concrete_method():
print('hello')
prop = property(_get_prop, _set_prop)
prop2 = property(_get_prop2, _set_prop2)
@abstractmethod
を実装せずに継承したクラスを定義し、インスタンス化すると例外が発生する。
class ExtendSampleABC(SampleABC):
pass
esabc = ExtendSampleABC()
# TypeError: Can't instantiate abstract class ExtendSampleABC with
# abstract methods _get_prop, _set_prop, prop,
# sample_abstract_classmethod, sample_abstract_method,
# sample_abstract_property, sample_abstract_staticmethod
以下のように実装を行うと例外は発生しない。
class ConcreteSampleABC(SampleABC):
def __init__(self):
self._property = 0
self._prop = ''
def sample_abstract_method(self):
pass
@classmethod
def sample_abstract_classmethod(cls):
pass
@staticmethod
def sample_abstract_staticmethod():
pass
@property
def sample_abstract_property(self):
return self._property
@sample_abstract_property.setter
def sample_abstract_property(self, value):
self._property = value
def _get_prop(self):
return self._prop
def _set_prop(self, value):
self._prop = value
prop = property(_get_prop, _set_prop)
csabc = ConcreteSampleABC()