Seite 1 von 1

Klassen Vererbung

Verfasst: Donnerstag 12. Januar 2023, 15:12
von Phiene
Ich will eine Klasse Schüler anlegen welche aus Name und Schulnote besteht
zwei Schüler sollen dann einer Liste Personen übergeben werden

dann soll eine weitere Klasse Studenten erstellt werden welche von Schüler erbt mit Name, Schulnote und Bachelornote
zwei Studenten sollen wieder der obigen Liste Personen hinzugefügt werden

Ich weiß nicht wo ich einen Fehler habe...

Code: Alles auswählen

class Schueler:
    def _init_(self, name, schulnote):
        self.name = name
        self.schulnote = schulnote
        
    def get_infos(self):
        return "Name: " + self.name + ", Schulnote: " + str(self.schulnote)
    
sus1 = Schueler("Max", 1.0)
sus2 = Schueler("Mia",1.1)
print(sus1.get_infos()) 
print(sus2.get_infos())

personen = []
personen.append([sus1.name, sus1.schulnote])
personen.append([sus2.name, sus2.schulnote])
print(personen)

class BachelorStudent(Schueler):
    def _init_(self, name, schulnote, bachelornote):
        super()._init_(name, schulnote)
        self.bachelornote = bachelornote
    def get_infos(self):
        return super().get_infos() + ", Bachelornote: " + str(self.bachelornote)

ba1 = BachelorStudent("Stefan", 1.2, 2.0)
ba2 = BachelorStudent("Sindra", 1.3, 2.1)
print(ba1.get_infos())
print(ba2.get_infos())

personen.append([ba1.name, ba1.schulnote, ba1.bachelornote])
personen.append([ba2.name, ba2.schulnote, ba2.bachelornote])
print(personen)
Eine weitere Frage wäre wie ich alle Schulnoten von Bachelorstudenten ausgeben könnte aus der Liste Personen.

Re: Klassen Vererbung

Verfasst: Donnerstag 12. Januar 2023, 15:33
von __deets__
Du musst __init__ (mit zwei Unterstrichen davor und dahinter) schreiben. Alle Spezial-Methoden von Python haben diese Konvention.

Deine Liste personen ist so auch Quatsch, da muessen die susX/baX Objekte rein. Nicht eine heterogene Sammlung deren Attribute.

Re: Klassen Vererbung

Verfasst: Donnerstag 12. Januar 2023, 15:40
von Phiene
wie erstellt man denn so eine Liste?

Re: Klassen Vererbung

Verfasst: Donnerstag 12. Januar 2023, 15:41
von __deets__
Du erstellst doch schon eine Liste. Wenn ich sage, pack die Objekte sus1, sus2 etc in ein Liste, was daran ist unklar?

Re: Klassen Vererbung

Verfasst: Donnerstag 12. Januar 2023, 15:45
von Phiene
das hab ich jetzt, kannst du mir einen Tipp geben wie ich eine Schleife schreibe um alle Schulnoten von Bachelorstudenten auszugeben?

Re: Klassen Vererbung

Verfasst: Donnerstag 12. Januar 2023, 15:50
von __deets__
Du musst ueber alle Personen interieren, und mit isinstance pruefen, ob es sich bei dem gerade betrachteten Objekt um das des richtigen Typs handelt. Aehnlich zu dem hier:

Code: Alles auswählen

numbers = [1.0, 1, 3.0, 3]
for number in numbers:
    if isinstance(number, float):
        print("Nachkommazahl", number)

Re: Klassen Vererbung

Verfasst: Donnerstag 12. Januar 2023, 16:17
von __blackjack__
@Phiene: Wobei `isinstance()` beziehungsweise überhaupt Typprüfungen ein „code smell“ sind. Wenn man Objekte in eine Liste steckt, dann sollte man hinterher auch nur Methoden und Eigenschaften benutzen die *alle* Objekte in der Liste haben. Wenn man eine Bachelor-Note von den Personen haben will, dann sollten da auch nur Personen in der Liste stehen die so etwas auch haben. Real stellt sich ja auch die Frage warum Schüler und Studenten gemeinsam in einer Liste stecken, wenn am Ende etwas mit den Studenten gemacht werden soll was mit den Schülern nicht geht. In eine Liste gehören in der Regel nur Objekte vom gleichen (Duck-)Typ.

Namen sollte man weder Abkürzen noch nummerieren. Im konkreten Fall stellt sich auch die Frage ob die Objekte überhaupt an einen Namen gebunden werden müssen.