En el siguiente código, creo una clase abstracta base Base. Quiero que todas las clases que heredan Baseproporcionen la namepropiedad, así que hice esta propiedad como un @abstractmethod.
Luego creé una subclase de Base, llamada Base_1, que está destinada a proporcionar alguna funcionalidad, pero aún permanece abstracta. No hay ninguna namepropiedad en Base_1, pero, sin embargo, Python instala un objeto de esa clase sin error. ¿Cómo se crean propiedades abstractas?
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
fuente
fuente

@propertyenclass C,namevolverá a un método.Respuestas:
Desde Python 3.3 se corrigió un error, lo que significa que el
property()decorador ahora se identifica correctamente como abstracto cuando se aplica a un método abstracto.Nota: el pedido es importante, debes usarlo
@propertyantes@abstractmethodPython 3.3+: ( documentos de Python ):
Python 2: ( documentos de Python )
fuente
Hasta Python 3.3 , no puede anidar
@abstractmethody@property.Úselo
@abstractpropertypara crear propiedades abstractas ( documentos ).El código ahora genera la excepción correcta:
Rastreo (llamadas recientes más última): Archivo "foo.py", línea 36, en b1 = Base_1 ('abc') TypeError: no se puede crear una instancia de la clase abstracta Base_1 con el nombre de métodos abstractosfuente
@abstractpropertyestá en desuso a favor de una combinación como OP.raise NotImplementedErrorBasado en la respuesta de James anterior
y úsalo como decorador
fuente