Ich habe mit ABCMeta
in Python abstrakte Klassen im Einsatz. Wenn Sie eine abstrakte Methode schreiben, markieren Sie sie mit dem Decorator @abstractmethod
. Eine Sache, die ich seltsam fand (und im Gegensatz zu anderen Sprachen) ist, dass, wenn die Unterklasse die Superklassenmethode überschreibt, kein Dekorator wie @override
bereitgestellt wird. Weiß jemand, was die Logik dahinter sein könnte?Warum kein @override-Dekorator in Python, um die Lesbarkeit des Codes zu verbessern?
Dies macht es für jemanden, der den Code liest, leicht verwirrend, schnell festzustellen, welche Methoden abstrakte Methoden überschreiben/implementieren im Vergleich zu Methoden, die nur in der Unterklasse existieren.
Warum würden Sie brauchen einen Dekorateur zur Verfügung zu stellen? Ein Decorator gibt Ihnen die Möglichkeit, eine Funktion durch ein neues Objekt zu ersetzen, aber in Python ist dies nicht notwendig, da dynamisch nach Namen in einer Klasse gesucht wird (zB späte Bindung) und die Klassen in Method Resolution Order (MRO) durchsucht werden. jedes Mal. Daher maskiert eine in einer Unterklasse definierte Methode eine Methode in einer Elternklasse * natürlich *. –
Und das * Ziel * der abstrakten Methoden ist sicherzustellen, dass sie implementiert werden; Sie können keine Instanz einer Klasse erstellen, für die noch abstrakte Methoden vorhanden sind. Nicht für sie, um sich von anderen Methoden zu unterscheiden. –
@MartijnPieters gleichen Verhaltens (MRO) wird in Java angewendet. Die Annotation '@ Override' dient lediglich dazu, dem Entwickler während der Kompilierungszeit Tippfehler zuzufügen (wenn der Methodenname zum Beispiel falsch geschrieben wurde). – alfasin