Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:obj:mehrvererb

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
python:obj:mehrvererb [2021/01/20 09:36] lutzpython:obj:mehrvererb [2021/01/20 11:45] (aktuell) – [Erklärvideo] lutz
Zeile 1: Zeile 1:
 ======Mehrfachvererbung====== ======Mehrfachvererbung======
  
-**Objekt:** Tojota Primus Hybrid+**Objekt:** Toyota Primus Hybrid
  
 {{ :python:obj:toyota-hybrid-cc.jpg?400 |}} {{ :python:obj:toyota-hybrid-cc.jpg?400 |}}
Zeile 8: Zeile 8:
   * Gewicht: 1,6 Tonnen   * Gewicht: 1,6 Tonnen
   * Leistung: 122 PS   * Leistung: 122 PS
-  * +  * Farbe: blaugrau 
 +  * Geschwindigkeit: 0 km/h 
 +  * 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: 
 + 
 +{{ :python:obj:mehrvererb.png?direct&400 |}}  
 + 
 +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, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze): # Konstruktor 
 +        self.bezeichnung = bezeichnung 
 +        self.leistung = leistung 
 +        self.farbe = farbe 
 +        self.geschwindigkeit = geschwindigkeit 
 +        self.sitzplaetze 
 + 
 +    def geschwindigkeitAendern(self, wert): 
 +        self.geschwindigkeit += wert 
 +        return self.geschwindigkeit 
 + 
 +    def lackieren(self, farbe): 
 +        self.farbe = farbe 
 + 
 +    def ausgabe(self): 
 +        print("PKW"
 +        print("Bezeichnung:",self.bezeichnung) 
 +        print("Leistung:", self.leistung,"PS"
 +        print("Farbe:", self.farbe) 
 +        print("Geschwindigkeit:", self.geschwindigkeit,"km/h"
 +        print("Sitzplätze",self.sitzplaetze) 
 + 
 + 
 +# Definition der abgeleiteten Klassen 
 + 
 +class VerbrennerPKW(PKW): 
 + 
 +    # zusätzliches Attribut der Klasse 
 +    tankinhalt = 0 
 +     
 +    def __init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze, tankinhalt): # Konstruktor 
 +        # zunächst wird er Konstruktor der Elternklasse aufgerufen 
 +        PKW.__init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze) 
 +        # dann wird noch das letzte Attribut zugewiesen 
 +        self.tankinhalt=tankinhalt 
 + 
 +    def ausgabe(self): 
 +        PKW.ausgabe(self) 
 +        print("Tankinhalt:",self.tankinhalt,"l"
 + 
 +    def tanken(self,wert): 
 +        self.tankinhalt += wert 
 + 
 +class ElektroPKW(PKW): 
 + 
 +    # zusätzliches Attribut der Klasse 
 +    ladezustand = 0 
 +     
 +    def __init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze, ladezustand): # Konstruktor 
 +        # zunächst wird er Konstruktor der Elternklasse aufgerufen 
 +        PKW.__init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze) 
 +        # dann wird noch das letzte Attribut zugewiesen 
 +        self.ladezustand=ladezustand 
 + 
 +    def ausgabe(self): 
 +        PKW.ausgabe(self) 
 +        print("Ladezustand:",self.ladezustand,"%"
 + 
 +    def laden(self,ladezustand): 
 +        self.ladezustand += wert 
 + 
 + 
 +class Hybrid(VerbrennerPKW, ElektroPKW): 
 + 
 +    def __init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze, ladezustand, tankinhalt): # Konstruktor 
 +        # Man ruft einfach beide Konstruktoren der Elternklasse auf 
 +        ElektroPKW.__init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze, ladezustand) 
 +        VerbrennerPKW.__init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze, tankinhalt) 
 + 
 +    def ausgabe(self): 
 +        ElektroPKW.ausgabe(self) 
 +        print("Tankinhalt:",self.tankinhalt,"l"
 + 
 + 
 +# Hauptprogramm 
 + 
 +# Instanzen der Klassen werden erzeugt 
 + 
 +ford = VerbrennerPKW("Ford Focus",150,"weiß",30, 5, 50) 
 +tesla = ElektroPKW("Tesla Roadster",306,"blau",0, 2, 100) 
 +toyota = Hybrid("Toyota Primus",120,"blaugrau",0,5,40,80) 
 + 
 +# Für die Objekte wird die Methode ausgabe() ausgeführt 
 + 
 +ford.ausgabe() 
 +print() 
 +tesla.ausgabe() 
 +print() 
 +toyota.ausgabe() 
 + 
 +</code> 
 + 
 +Der Quelltext aus dem Abschnitt Vererbung wurde um die Klasse Hybrid ergänzt. In der Klassendefinition ''%%class Hybrid(VerbrennerPKW, ElektroPKW)%%'' erscheinen beide Elternklassen. Im Konstruktor: 
 + 
 +<code python> 
 +def __init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze, ladezustand, tankinhalt): # Konstruktor 
 +        # Man ruft einfach beide Konstruktoren der Elternklasse auf 
 +        ElektroPKW.__init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze, ladezustand) 
 +        VerbrennerPKW.__init__(self, bezeichnung, leistung, farbe, geschwindigkeit, sitzplaetze, tankinhalt) 
 +</code> 
 + 
 +werden beide Konstruktoren der Elternklassen aufgerufen. Alternativ kann man auch einen Konstruktor aufrufen und das fehlende Attribut im Konstruktor definieren. 
 + 
 +Auch bei der ''%%ausgabe()%%'' wird die entsprechende Methode einer Elternklasse aufgerufen und die entsprechende ''%%print%%''-Anweisung ergänzt.  
 + 
 +=====Erklärvideo===== 
 + 
 +{{youtube>s_zUOuGN4lo}} 
 +=====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) ! 
 + 
 +{{ :python:obj:gebaeude-mehr.png?direct&400 |}} 
 + 
 +Schreibe für die neue Klasse die Methoden ''%%__init__%%'' und ''%%__str__%%'' und teste die Klasse an Beispielen. 
 + 
  
  
python/obj/mehrvererb.1611131795.txt.gz · Zuletzt geändert: 2021/01/20 09:36 von lutz