В следующем коде я создаю базовый абстрактный класс 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
properties
abstract-class
decorator
Борис Горелик
источник
источник
@property
вclass C
,name
возвращается к методу.Ответы:
Начиная с Python 3.3 была исправлена ошибка, означающая, что
property()
декоратор теперь правильно идентифицируется как абстрактный при применении к абстрактному методу.Примечание: порядок имеет значение, вы должны использовать
@property
перед@abstractmethod
Python 3.3+: ( документы Python ):
Python 2: ( документы Python )
источник
До Python 3.3 вы не можете вкладывать
@abstractmethod
и@property
.Используйте
@abstractproperty
для создания абстрактных свойств ( документов ).Теперь код вызывает правильное исключение:
источник
@abstractproperty
он устарел в пользу комбинации, такой как OP.raise NotImplementedError
На основе ответа Джеймса выше
и использовать как декоратор
источник