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:38] – lutz | python:obj:mehrvererb [2021/01/20 11:45] (aktuell) – [Erklärvideo] lutz | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ======Mehrfachvererbung====== | ======Mehrfachvererbung====== | ||
| - | **Objekt: | + | **Objekt: |
| {{ : | {{ : | ||
| Zeile 11: | Zeile 11: | ||
| * Geschwindigkeit: | * Geschwindigkeit: | ||
| * 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 Klasse Hybrid. Die folgende Grafik zeigt die Klasse im UML-Diagramm: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | 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.1611131898.txt.gz · Zuletzt geändert: von lutz
