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
Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden
-
- User
- Beiträge: 116
- Registriert: Freitag 3. Juni 2016, 05:45
Ziel war eigentlich nur, dass keine der Methoden in der Tochterklasse vergessen werden die unbedingt vorhanden sein sollen (die in der Basisklasse definiert sind).
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
@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.
When we say computer, we mean the electronic computer.
-
- User
- Beiträge: 116
- Registriert: Freitag 3. Juni 2016, 05:45
In der Basisklasse sollen davon nur Dummys stehen.
-
- User
- Beiträge: 116
- Registriert: Freitag 3. Juni 2016, 05:45
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.
Ob das jetzt sinnvoll ist oder nicht sei dahin gestellt.
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
@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.
When we say computer, we mean the electronic computer.
@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.
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.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 mit dem @abstractmethod-Dekorator.
Der Hinweis, dass man in Python eher selten so progammiert, hat jedoch nach wie vor seine Berechtigung...
Der Hinweis, dass man in Python eher selten so progammiert, hat jedoch nach wie vor seine Berechtigung...
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
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
- noisefloor
- User
- Beiträge: 3843
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Gruß, noisefloor
"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.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.
Gruß, noisefloor
-
- User
- Beiträge: 116
- Registriert: Freitag 3. Juni 2016, 05:45
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.
Auf @abtractmethod bin ich auch schon gestoßen, konnte nur nichts so richtig mit anfangen.
Kommst du denn jetzt weiter damit?Patrick1990 hat geschrieben:Auf @abtractmethod bin ich auch schon gestoßen, konnte nur nichts so richtig mit anfangen.
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.