Ist die Durchsetzung einer abstrakten Methode Umsetzung unpythonic?
Beim entwerfen von Klassen, die abstrakte Methoden können sehr hilfreich sein. Von dem was ich weiß, Python besitzt keinen Mechanismus für die Durchsetzung einer geerbten Klasse zum implementieren der abstrakten Methode. In meinem code (siehe Beispiel unten) ich einen Fehler bei assertion in der base-Klasse zu führen zu einem Laufzeitfehler, wenn nicht implementiert. Ist dies unpythonic?
class Dog(Animal):
def speak(self):
return "bark"
class Animal():
def speak(self):
assert(False) #abstract
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python eigentlich hat haben abstrakte Klassen abstrakte Formen Methoden:
Auf der anderen Seite die fundamentale Frage "ist das pythonic" ist ein bisschen schwieriger zu sagen. Wenn Ihre Absicht ist es, die abstrakte Basis-Klasse, so dass Sie später überprüfen, um sicherzustellen, dass Werte, die von Ihr Erben, dann Nein, das ist nicht besonders pythonic, obwohl es möglich ist, beliebige Typen abstrakte Unterklassen Ihrer baseclass. Auf der anderen Seite, es ist völlig in Ordnung, um eine abstract baseclass, implementiert einige Funktionen basierend auf der Umsetzung in konkrete Unterklassen. Zum Beispiel
collections.Sequence
undcollections.Mapping
tun genau dies für die Liste, wie und dict wie Klassen, Unterklassen bieten kann__getitem__
und kann__contains__
und andere kostenlos.Sicher, Sie sollten nie
assert()
außer zu dokumentieren, die Erwartungen der code; Wenn es eigentlich möglich, die geltend machen, zu scheitern, sollte nicht mit assert. Optimiert python (python -O script.py
) nicht überprüft Behauptungen.Edit: mehr Ausstellung:
Wenn Sie überprüft den Typ eines Wertes:
Wenn aus irgendeinem Grund Sie nicht verwenden können
@abstractmethod
, aber immer noch wollen, dass die Wirkung, Sie erhöhen solltenNotImplementedError
. Sie können dies tun wollen, weil Sie eigentlich tun wollen, Instanzen von dieser Klasse, von denen einige vielleicht nicht implementieren müssen, um optionale Funktionalität. Sollten Sie dennoch berücksichtigt, für die Möglichkeit, dass die Funktion aufgerufen wurde, durchsuper()
. In einer ersten Annäherung könnte wie folgt Aussehen.ABC sind ein Artefakt von C++ und sind im Gegensatz zu duck-typing. Wenn die Klasse Tier nicht definieren
speak
es würde tun, was Sie wollen ohne Anstrengung auf allen.C++ und verwandten Sprachen Kraft, die Sie zum erstellen von Alphabeten, denn das ABC ist tatsächlich eine interface-Beschreibung. Python meidet compiler erzwungene interface-Deklarationen, wie Sie versuchen, zu dokumentieren – in-code – ein Vertrag, der besser durchgesetzt extra-sprachlichen Mittel.
Gut, wenn Sie nicht zählen die Methode
speak
in Ihre base-Klasse und irgendwie passiert, es zu benutzen, wird der code nicht sowieso. Die Frage ist, wie wahrscheinlich ist es und wie zu sagen, der Benutzer (einNotImplementedError
vielleicht passt hier besser als eine Behauptung).Mit python im Allgemeinen ist es nicht immer möglich ist, direkt zu Einschränkungen auf den code, zumindest aus der objektorientierten Sicht (Gedanken über abstrakte Klassen, eigenes Verfahren, ...).
Zur Durchsetzung einer Unterklasse zu implementieren ist eine Methode, möchten Sie vielleicht so etwas wie:
Bedeutet dies nicht, dass die Methode implementiert werden, die von der Unterklasse, aber es wird einfach ein Fehler ausgelöst, wenn die Methode sprechen, ist nicht implementiert.