次のコードでは、基本抽象クラス を作成しますBase
。 を継承するすべてのクラスにプロパティBase
を提供する必要があるname
ため、このプロパティを にしました@abstractmethod
。
Base
次に、という のサブクラスを作成しました。これは、何らかの機能を提供することを目的としていますが、抽象的のままです。には プロパティはBase_1
ありませんが、それでも Python はエラーなしでそのクラスのオブジェクトをインスタンス化します。抽象プロパティはどのように作成するのでしょうか?name
Base_1
from abc import ABCMeta, abstractmethod
class Base(object):
# class Base(metaclass = ABCMeta): <- Python 3
__metaclass__ = ABCMeta
def __init__(self, str_dir_config):
self.str_dir_config = str_dir_config
@abstractmethod
def _do_stuff(self, signals):
pass
@property
@abstractmethod
def name(self):
"""This property will be supplied by the inheriting classes
individually.
"""
pass
class Base1(Base):
__metaclass__ = ABCMeta
"""This class does not provide the name property and should
raise an error.
"""
def __init__(self, str_dir_config):
super(Base1, self).__init__(str_dir_config)
# super().__init__(str_dir_config) <- Python 3
def _do_stuff(self, signals):
print "Base_1 does stuff"
# print("Base_1 does stuff") <- Python 3
class C(Base1):
@property
def name(self):
return "class C"
if __name__ == "__main__":
b1 = Base1("abc")
ベストアンサー1
Python 3.3以降ではバグが修正され、property()
抽象メソッドに適用されたときにデコレータが抽象として正しく識別されるようになりました。
@property
注: 順序は重要です。上記のものを使用する必要があります。@abstractmethod
Python 3.3+: ( Python ドキュメント):
from abc import ABC, abstractmethod
class C(ABC):
@property
@abstractmethod
def my_abstract_property(self):
...
Python 2: ( Python ドキュメント)
from abc import ABCMeta, abstractproperty
class C:
__metaclass__ = ABCMeta
@abstractproperty
def my_abstract_property(self):
...