Im folgenden Code erstelle ich eine abstrakte Basisklasse Base
. Ich möchte, dass alle Klassen, die von erben Base
, die name
Eigenschaft bereitstellen , also habe ich diese Eigenschaft zu einer gemacht @abstractmethod
.
Dann habe ich eine Unterklasse von Base
namens erstellt Base_1
, die einige Funktionen bereitstellen soll, aber dennoch abstrakt bleibt. Es gibt keine name
Eigenschaft in Base_1
, aber Python installiert dennoch ein Objekt dieser Klasse ohne Fehler. Wie schafft man abstrakte Eigenschaften?
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
quelle
quelle
@property
in zu verwendenclass C
,name
wird auf eine Methode zurückgegriffen.Antworten:
Seit Python 3.3 wurde ein Fehler behoben, der bedeutet, dass der
property()
Dekorator jetzt korrekt als abstrakt identifiziert wird, wenn er auf eine abstrakte Methode angewendet wird.Hinweis: Reihenfolge ist wichtig, müssen Sie verwenden
@property
vor@abstractmethod
Python 3.3+: ( Python-Dokumente ):
Python 2: ( Python-Dokumente )
quelle
Bis Python 3.3 , können Sie nicht nisten
@abstractmethod
und@property
.Verwenden Sie
@abstractproperty
diese Option , um abstrakte Eigenschaften ( Dokumente ) zu erstellen .Der Code löst jetzt die richtige Ausnahme aus:
quelle
@abstractproperty
wird sie zugunsten einer Kombination wie der von OP veraltet.raise NotImplementedError
Basierend auf James Antwort oben
und benutze es als Dekorateur
quelle