Sichergehen, dass alle Methoden der Basisklasse in Tochterklasse überschrieben werden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@Patrick1990: ich frage mich, warum man sowas machen möchte? Verfolgst du da ein konkretes Ziel?
When we say computer, we mean the electronic computer.
Patrick1990
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).
Benutzeravatar
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.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

In der Basisklasse sollen davon nur Dummys stehen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Patrick1990: wenn das nur Dummies sind, dann laß die Methode doch ganz weg.
Patrick1990
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.
Benutzeravatar
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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das geht mit dem @abstractmethod-Dekorator.

Der Hinweis, dass man in Python eher selten so progammiert, hat jedoch nach wie vor seine Berechtigung...
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Patrick1990
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.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Antworten