Python 抽象クラスで抽象プロパティを作成するにはどうすればいいですか? 質問する

Python 抽象クラスで抽象プロパティを作成するにはどうすればいいですか? 質問する

次のコードでは、基本抽象クラス を作成しますBase。 を継承するすべてのクラスにプロパティBaseを提供する必要があるnameため、このプロパティを にしました@abstractmethod

Base次に、という のサブクラスを作成しました。これは、何らかの機能を提供することを目的としていますが、抽象的のままです。には プロパティはBase_1ありませんが、それでも Python はエラーなしでそのクラスのオブジェクトをインスタンス化します。抽象プロパティはどのように作成するのでしょうか?nameBase_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):
        ...

おすすめ記事