2022-02-11に投稿

Python 標準ライブラリ abc 抽象基底クラス

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()

参考

Originally published at marusankakusikaku.jp
ツイッターでシェア
みんなに共有、忘れないようにメモ

maru3kaku4kaku

Pythonこつこつ学習中。よく忘れる。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント