Seite 1 von 1
Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 21:17
von Patrick1990
Hallo,
eine Frage:
ist es möglich in einer Basisklasse Methoden zu definieren, welche in jeder Tochterklasse unbedingt überschrieben (neu definiert) werden müssen? Sodass ein Fehler auftritt, wenn diese Methoden in der Basisklasse nicht neu definiert werden.
Vielen Dank
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 21:24
von Sirius3
@Patrick1990: in Python ist es unüblich, irgendetwas zu erzwingen. Wenn eine Methode nicht definiert ist, wirst Du das früh genug merken, wenn Du versuchst, sie aufzurufen.
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 21:26
von sls
@Patrick1990: ich frage mich, warum man sowas machen möchte? Verfolgst du da ein konkretes Ziel?
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 21:30
von Patrick1990
Ziel war eigentlich nur, dass keine der Methoden in der Tochterklasse vergessen werden die unbedingt vorhanden sein sollen (die in der Basisklasse definiert sind).
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 21:34
von sls
@Patrick1990: "vergessen"? Alle Methoden der Elternklasse (Basisklasse) werden doch automatisch an die Kindklasse (Tochterklasse) vererbt. Alles was du also in deiner Basisklasse definierst, wird zwangsläufig auch in der Tochterklasse vorhanden sein.
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 21:39
von Patrick1990
In der Basisklasse sollen davon nur Dummys stehen.
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 22:19
von Sirius3
@Patrick1990: wenn das nur Dummies sind, dann laß die Methode doch ganz weg.
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 22:28
von Patrick1990
Mein Vorgesetzter wollte halt, dass alle Methoden einmal in der Basisklasse definiert werden (ohne Inhalt) und in der Tochterklasse dann der Inhalt eingefügt wird.
Ob das jetzt sinnvoll ist oder nicht sei dahin gestellt.
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 22:40
von sls
@Patrick1990: eine einfache Möglichkeit die mir dazu jetzt einfällt ist, dass die Methoden der Basisklasse z.B. einen Wert / String / whatever -> "Nichts" zurückliefern und dann im späteren Schritt einfach über die Tochterklasse geprüft wird, ob der Rückgabewert immernoch vorhanden ist, womit die Methode dann zu ändern wäre.
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 22:49
von Sirius3
@Patrick1990: das ist ein schlechtes Argument. Eine Funktion sollte immer etwas sinnvolles tun, eine Funktion, die keine Funktion hat, ist ein Programmierfehler. Es geht sogar so weit, dass es in Python selten sinnvoll ist, überhaupt mit Vererbung zu arbeiten.
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Dienstag 7. November 2017, 23:44
von kbr
Patrick1990 hat geschrieben:Mein Vorgesetzter wollte halt, dass alle Methoden einmal in der Basisklasse definiert werden (ohne Inhalt) und in der Tochterklasse dann der Inhalt eingefügt wird.
Das geht, indem Du die Methoden definierst und dort jeweils einen NotImplementedError auslöst. Wenn auf eine Subclass eine dieser Methode aufgerufen wird, aber nicht überladen wurde, dann wird diese Exception ausgelöst. Wäre die Methode hingegen auch in der Superclass nicht definiert, dann gibt es gleichfalls eine Exception, nämlich einen AttributeError. D.h. die Arbeit kannst Du Dir sparen, es sei denn, Du hast gute Gründe, zwischen beiden Exceptions zu unterscheiden. Kannst ja mal Deinen Vorgesetzten dazu befragen, falls Du meinst, das wäre eine gute Idee.
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Mittwoch 8. November 2017, 06:30
von snafu
Das geht mit dem
@abstractmethod-Dekorator.
Der Hinweis, dass man in Python eher selten so progammiert, hat jedoch nach wie vor seine Berechtigung...
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Mittwoch 8. November 2017, 07:13
von __deets__
Vor allem ist es immer nur ein Laufzeitfehler. Je nach Struktur des Programms fällt das also erst mitten im Betrieb auf.
Darum empfiehlt sich immer gleich mit Unit Tests zu arbeiten. Die Stellen dann sicher, das die gewünschte Funktion besteht. Oder schlagen fehl wenn nicht b
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Mittwoch 8. November 2017, 07:24
von noisefloor
Hallo,
Mein Vorgesetzter wollte halt, dass alle Methoden einmal in der Basisklasse definiert werden (ohne Inhalt) und in der Tochterklasse dann der Inhalt eingefügt wird.
"Eingefügt" ist ja strikt gesehen auch falsch. Du kannst du Methoden aus der Basisklasse "nur" überschreiben. Was aber das gleiche ist wie als wäre die Methode in der Basisklasse nicht vorhanden.
Gruß, noisefloor
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Mittwoch 8. November 2017, 07:39
von Patrick1990
Vielen Dan für die Antworten, ich werde es ihm mitteilen und schauen was er dazu sagt.
Auf @abtractmethod bin ich auch schon gestoßen, konnte nur nichts so richtig mit anfangen.
Re: Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
Verfasst: Mittwoch 8. November 2017, 09:45
von snafu
Patrick1990 hat geschrieben:Auf @abtractmethod bin ich auch schon gestoßen, konnte nur nichts so richtig mit anfangen.
Kommst du denn jetzt weiter damit?
Den Hinweis, dass es dir nach deinem bisherigen Python-Verständis ungewöhnlich erscheint, würde ich auf jeden Fall irgendwie geben. Vielleicht will er ja genau dies hören.