No código a seguir, crio uma classe abstrata base Base
. Quero que todas as classes que herdam de Base
forneçam a name
propriedade, portanto, tornei essa propriedade um @abstractmethod
.
Em seguida, criei uma subclasse de Base
, chamada Base_1
, que deve fornecer algumas funcionalidades, mas ainda permanece abstrata. Não há nenhuma name
propriedade em Base_1
, mas, apesar disso, python instatinates um objeto dessa classe sem um erro. Como criar propriedades abstratas?
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
Boris Gorelik
fonte
fonte
@property
noclass C
,name
irá reverter para um métodoRespostas:
Desde o Python 3.3, um bug foi corrigido, o que significa que o
property()
decorador agora está corretamente identificado como abstrato quando aplicado a um método abstrato.Nota: O pedido é importante, você deve usar
@property
antes@abstractmethod
Python 3.3+: ( documentos python ):
Python 2: ( documentos python )
fonte
Até o Python 3.3 , você não pode aninhar
@abstractmethod
e@property
.Use
@abstractproperty
para criar propriedades abstratas ( documentos ).O código agora levanta a exceção correta:
fonte
@abstractproperty
está obsoleto em favor de uma combinação como os OPs.raise NotImplementedError
Com base na resposta de James acima
e usá-lo como um decorador
fonte