1. ホーム
  2. python

[解決済み] Pythonの抽象クラスで抽象プロパティを作成する方法

2022-04-21 21:22:06

質問

次のコードでは、ベースとなる抽象クラスを作成しています。 Base . を継承するすべてのクラスが Base を提供するために name というプロパティがあったので、このプロパティを @abstractmethod .

のサブクラスを作成しました。 Base という名前の Base_1 これは、ある種の機能を提供しつつも、抽象的な状態を維持することを意図しています。また name のプロパティは Base_1 しかし、それにもかかわらず python はエラーなしでそのクラスのオブジェクトをインスタンス化します。どのように抽象プロパティを作成するのでしょうか?

from abc import ABCMeta, abstractmethod

class Base(object):
    __metaclass__ = ABCMeta
    def __init__(self, strDirConfig):
        self.strDirConfig = strDirConfig
    
    @abstractmethod
    def _doStuff(self, signals):
        pass
    
    @property    
    @abstractmethod
    def name(self):
        # this property will be supplied by the inheriting classes
        # individually
        pass
    

class Base_1(Base):
    __metaclass__ = ABCMeta
    # this class does not provide the name property, should raise an error
    def __init__(self, strDirConfig):
        super(Base_1, self).__init__(strDirConfig)
    
    def _doStuff(self, signals):
        print 'Base_1 does stuff'
        

class C(Base_1):
    @property
    def name(self):
        return 'class C'
    
        
if __name__ == '__main__':
    b1 = Base_1('abc')  

解決方法は?

から Python 3.3 のバグを修正しました。 property() デコレーターが抽象的なメソッドに適用された場合、抽象的であると正しく認識されるようになりました。

注:順序が重要です。 @property@abstractmethod

Python 3.3以上。 ( パイソン文書 ):

from abc import ABC, abstractmethod

class C(ABC):
    @property
    @abstractmethod
    def my_abstract_property(self):
        ...

Python 2: ( パイソン文書 )

from abc import ABC, abstractproperty

class C(ABC):
    @abstractproperty
    def my_abstract_property(self):
        ...