Seit diese Frage ursprünglich gestellt wurde, hat Python die Implementierung abstrakter Klassen geändert. Ich habe einen etwas anderen Ansatz verwendet, indem ich den abc.ABC-Formalismus in Python 3.6 verwendet habe. Hier definiere ich die Konstante als eine Eigenschaft, die in jeder Unterklasse definiert werden muss.
from abc import ABC, abstractmethod
class Base(ABC):
@property
@classmethod
@abstractmethod
def CONSTANT(cls):
return NotImplementedError
def print_constant(self):
print(type(self).CONSTANT)
class Derived(Base):
CONSTANT = 42
Dadurch wird die abgeleitete Klasse gezwungen, die Konstante zu definieren. Andernfalls wird eine TypeError
Ausnahme ausgelöst, wenn Sie versuchen, die Unterklasse zu instanziieren. Wenn Sie die Konstante für eine in der abstrakten Klasse implementierte Funktionalität verwenden möchten, müssen Sie über auf die Unterklassenkonstante zugreifentype(self).CONSTANT
statt nurCONSTANT
, da der Wert in der Basisklasse undefiniert ist.
Es gibt andere Möglichkeiten, dies zu implementieren, aber ich mag diese Syntax, da sie mir für den Leser am einfachsten und offensichtlichsten erscheint.
Die vorherigen Antworten haben alle nützliche Punkte berührt, aber ich bin der Meinung, dass die akzeptierte Antwort die Frage nicht direkt beantwortet, weil
- Die Frage fordert die Implementierung in einer abstrakten Klasse, aber die akzeptierte Antwort folgt nicht dem abstrakten Formalismus.
- Die Frage lautet, ob die Implementierung erzwungen wird. Ich würde argumentieren, dass die Durchsetzung in dieser Antwort strenger ist, da sie einen Laufzeitfehler verursacht, wenn die Unterklasse instanziiert wird, wenn sie
CONSTANT
nicht definiert ist. Die akzeptierte Antwort ermöglicht die Instanziierung des Objekts und gibt nur beim CONSTANT
Zugriff einen Fehler aus , wodurch die Durchsetzung weniger streng wird.
Dies ist kein Fehler bei den ursprünglichen Antworten. Seit der Veröffentlichung wurden wesentliche Änderungen an der Syntax der abstrakten Klasse vorgenommen, die in diesem Fall eine übersichtlichere und funktionalere Implementierung ermöglichen.