python:obj:mehrvererb
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
python:obj:mehrvererb [2021/01/20 09:49] – lutz | python:obj:mehrvererb [2021/01/20 11:45] (aktuell) – [Erklärvideo] lutz | ||
---|---|---|---|
Zeile 12: | Zeile 12: | ||
* Sitzplätze: | * Sitzplätze: | ||
- | Wir betrachten das Objekt Toyota Primus Hybrid. Dieses Objekt besitzt sowohl einen Verbrennungs- als auch einen Elektroantrieb. Man kann in somit der Klasse Verbrenner-PKW und Elektro-PKW zuordnen. Man könnte also eine Klasse bilden, die die Eigenschaften **beider** Klassen erbt. Dieses Vorgehen nennt man **Mehrfachvererbung**. Wir nennen die neue Klass Hybrid. | + | Wir betrachten das Objekt Toyota Primus Hybrid. Dieses Objekt besitzt sowohl einen Verbrennungs- als auch einen Elektroantrieb. Man kann in somit der Klasse Verbrenner-PKW und Elektro-PKW zuordnen. Man könnte also eine Klasse bilden, die die Eigenschaften **beider** Klassen erbt. Dieses Vorgehen nennt man **Mehrfachvererbung**. Wir nennen die neue Klasse |
+ | |||
+ | {{ : | ||
+ | |||
+ | In unserem Fall müssen für die neue Klasse keine zusätzlichen Attribute gebildet werden. Theoretisch wäre das aber möglich. | ||
+ | |||
+ | In unserem Fall haben die beiden Klassen von denen geerbt wurde eine gemeinsame Elternklasse. Das muss aber nicht so sein. | ||
+ | |||
+ | =====Umsetzung in Python===== | ||
+ | |||
+ | <code python> | ||
+ | # Definition einer Klasse PKW | ||
+ | class PKW: | ||
+ | |||
+ | # Attribute der Klasse | ||
+ | bezeichnung="" | ||
+ | leistung=0 | ||
+ | farbe="" | ||
+ | geschwindigkeit=0 | ||
+ | sitzplaetze=0 | ||
+ | |||
+ | |||
+ | # Methoden der Klasse | ||
+ | |||
+ | def __init__(self, | ||
+ | self.bezeichnung = bezeichnung | ||
+ | self.leistung = leistung | ||
+ | self.farbe = farbe | ||
+ | self.geschwindigkeit = geschwindigkeit | ||
+ | self.sitzplaetze | ||
+ | |||
+ | def geschwindigkeitAendern(self, | ||
+ | self.geschwindigkeit += wert | ||
+ | return self.geschwindigkeit | ||
+ | |||
+ | def lackieren(self, | ||
+ | self.farbe = farbe | ||
+ | |||
+ | def ausgabe(self): | ||
+ | print(" | ||
+ | print(" | ||
+ | print(" | ||
+ | print(" | ||
+ | print(" | ||
+ | print(" | ||
+ | |||
+ | |||
+ | # Definition der abgeleiteten Klassen | ||
+ | |||
+ | class VerbrennerPKW(PKW): | ||
+ | |||
+ | # zusätzliches Attribut der Klasse | ||
+ | tankinhalt = 0 | ||
+ | |||
+ | def __init__(self, | ||
+ | # zunächst wird er Konstruktor der Elternklasse aufgerufen | ||
+ | PKW.__init__(self, | ||
+ | # dann wird noch das letzte Attribut zugewiesen | ||
+ | self.tankinhalt=tankinhalt | ||
+ | |||
+ | def ausgabe(self): | ||
+ | PKW.ausgabe(self) | ||
+ | print(" | ||
+ | |||
+ | def tanken(self, | ||
+ | self.tankinhalt += wert | ||
+ | |||
+ | class ElektroPKW(PKW): | ||
+ | |||
+ | # zusätzliches Attribut der Klasse | ||
+ | ladezustand = 0 | ||
+ | |||
+ | def __init__(self, | ||
+ | # zunächst wird er Konstruktor der Elternklasse aufgerufen | ||
+ | PKW.__init__(self, | ||
+ | # dann wird noch das letzte Attribut zugewiesen | ||
+ | self.ladezustand=ladezustand | ||
+ | |||
+ | def ausgabe(self): | ||
+ | PKW.ausgabe(self) | ||
+ | print(" | ||
+ | |||
+ | def laden(self, | ||
+ | self.ladezustand += wert | ||
+ | |||
+ | |||
+ | class Hybrid(VerbrennerPKW, | ||
+ | |||
+ | def __init__(self, | ||
+ | # Man ruft einfach beide Konstruktoren der Elternklasse auf | ||
+ | ElektroPKW.__init__(self, | ||
+ | VerbrennerPKW.__init__(self, | ||
+ | |||
+ | def ausgabe(self): | ||
+ | ElektroPKW.ausgabe(self) | ||
+ | print(" | ||
+ | |||
+ | |||
+ | # Hauptprogramm | ||
+ | |||
+ | # Instanzen der Klassen werden erzeugt | ||
+ | |||
+ | ford = VerbrennerPKW(" | ||
+ | tesla = ElektroPKW(" | ||
+ | toyota = Hybrid(" | ||
+ | |||
+ | # Für die Objekte wird die Methode ausgabe() ausgeführt | ||
+ | |||
+ | ford.ausgabe() | ||
+ | print() | ||
+ | tesla.ausgabe() | ||
+ | print() | ||
+ | toyota.ausgabe() | ||
+ | |||
+ | </ | ||
+ | |||
+ | Der Quelltext aus dem Abschnitt Vererbung wurde um die Klasse Hybrid ergänzt. In der Klassendefinition '' | ||
+ | |||
+ | <code python> | ||
+ | def __init__(self, | ||
+ | # Man ruft einfach beide Konstruktoren der Elternklasse auf | ||
+ | ElektroPKW.__init__(self, | ||
+ | VerbrennerPKW.__init__(self, | ||
+ | </ | ||
+ | |||
+ | werden beide Konstruktoren der Elternklassen aufgerufen. Alternativ kann man auch einen Konstruktor aufrufen und das fehlende Attribut im Konstruktor definieren. | ||
+ | |||
+ | Auch bei der '' | ||
+ | |||
+ | =====Erklärvideo===== | ||
+ | |||
+ | {{youtube> | ||
+ | =====Aufgaben===== | ||
+ | |||
+ | **Aufgabe 1** | ||
+ | |||
+ | Teste das Beispiel aus dem Video! | ||
+ | |||
+ | **Aufgabe 2** | ||
+ | |||
+ | Ergänze die Aufgabe 2 aus dem Abschnitt Vererbung um eine Klasse Uniklinik (Siehe UML-Diagramm) ! | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Schreibe für die neue Klasse die Methoden '' | ||
+ | |||
python/obj/mehrvererb.1611132582.txt.gz · Zuletzt geändert: 2021/01/20 09:49 von lutz