Klassen Vererbung

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
Phiene
User
Beiträge: 12
Registriert: Freitag 25. November 2022, 14:07

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Phiene
User
Beiträge: 12
Registriert: Freitag 25. November 2022, 14:07

wie erstellt man denn so eine Liste?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du erstellst doch schon eine Liste. Wenn ich sage, pack die Objekte sus1, sus2 etc in ein Liste, was daran ist unklar?
Phiene
User
Beiträge: 12
Registriert: Freitag 25. November 2022, 14:07

das hab ich jetzt, kannst du mir einen Tipp geben wie ich eine Schleife schreibe um alle Schulnoten von Bachelorstudenten auszugeben?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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)
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten