======Vererbung====== Zu Beginn betrachten wir wieder zwei Objekte mit gemeinsamen Eigenschaften: **Objekt:** Ford Focus {{ :python:obj:ford-cc.jpg?direct&250 |}} ([[https://www.flickr.com/photos/50523210@N08/6132990405/in/photolist-akXbnT-akXbvx-2jgdr6-BU5VWM-6b58Ca-7Mi4bJ-q2SVTt-7Minx7-7MecPK-7Met1x-pBP5yi-7VsBwJ-2hALmai-gofaGF-7Mes1e-M1RXzV-Hmohfz-2imEscV-23jaivN-6kLzRA-ruTJh-7Med54-6mUBDQ-ruSUK-7Mi3sd-5dPTKE-nrFdDF-ruThL-8VvyNk-o8FnC-7Zk4B1-59S7Ka-6kGxBe-7Mea3B-jvX8A7-7M6tYH-pBCGik-7M6otM-kxEaGz-7X3Dbs-gofcUW-2hug2hT-8HRWiv-2ckC8HS-8HV7Lq-cuLveY-abgRQJ-nphaBK-7Me6ZK-Kkt1sG|Bildquelle]]) * Gewicht: 1,5 Tonnen * Leistung: 150 PS * Farbe: weiß * Geschwindigkeit: 30 km/h * Sitzplätze: 5 **Objekt:** Tesla Roadster {{ :python:obj:tesla-cc.jpg?direct&250 |}} ([[https://www.flickr.com/photos/8000vueltas/5381204743/in/photolist-9cw5G8-9czbjq-6FdEHj-9czbFU-2Lh8v1-9cw5DX-2hkpVAo-4zeuVq-4zafaF-z4TdDW-poJ34f-2f7CEJS-5pYv1t-9cw63c-9cw5vp-5q3AWW-6F9kxe-9czbih-5pYfpD-bW8cLN-csbyob-9cw5SD-9cw64T-9cw5GX-2Lc9Mt-9czbqY-9czbp1-2LgQeh-9VG7CX-9czbPN-2LbVFg-9czbwh-f3X5Ra-uWDWXm-2Lc3FH-2LbSEM-cUfCjA-9czbkd-9cw5cM-2LgZts-9cw5PD-6Fdr1U-2gv5LFy-9cw63B-5pYbsc-uhdGYJ-9cw62v-ZnTUJ4-5pYgXg-9czbL1|Bildquelle]]) * Gewicht: 2 Tonnen * Leistung: 306 PS * Farbe: blau * Geschwindigkeit: 0 km/h * Sitzplätze: 2 Aus diesen beiden Objekten kann man jetzt eine Klasse PKW bilden: **Klassendiagramm:** {{ :python:obj:pkw.png?direct&300 |}} **Pythonquelltext** # 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) # Hauptprogramm # Instanzen der Klasse PKW, Objekte werden erzeugt ford = PKW("Ford Focus",150,"weiß",30, 5) tesla = PKW("Tesla Roadster",306,"blau",0, 2) # Für die Objekte wird die Methode ausgabe() ausgeführt ford.ausgabe() print() tesla.ausgabe() Neben den Gemeinsamen Attributen haben die beiden Objekte aber auch unterschiedliche Attribute. Der Tesla ist ein Elektroauto, der eine Batterie hat, die geladen wird. Der Ford ist ein Verbrenner, der mit Benzin fährt. Da es noch weitere Elektroautos und Verbrenner gibt könnte man also zwei weitere Klassen **Elekto-PKW** und **Verbrenner-PKW** bilden. Diese beiden Klassen haben aber auch gemeinsame Attribute mit der Klasse PKW. Man kann nun die beiden Klassen so bilden, dass sie die gemeinsamen Eigenschaften und Attribute der Klasse **PKW** erben, so dass nur noch die neuen Eigenschaften und Attribute hinzugefügt werden müssen. Durch dieses Vorgehen kann man einmal programmierten Quelltext wiederverwenden und die Programme werden einfacher und übersichtlicher. Im Klassendiagramm kennzeichnet man die Vererbung durch einen Pfeil: {{ :python:obj:vererb.png?direct&400 |}} =====Umsetzung in Python===== In Python definiert man eine abgeleitete Klasse indem man in der Definition hinter dem Klassennamen den Klassennamen der Elternklasse in Klammern Schreibt, also z.B. ''%%class VerbrennerPKW(PKW)%%''. In der abgeleiteten Klasse werden dann die neuen Attribute und Methoden hinzugefügt, also z.B. ''%%tankinhalt = 0%%'' und ''%%def tanken(wert)%%''. Dann müssen noch die Methoden angepasst werden, die weiter genutzt. Bei der ''%%__init__%%'' - Methode kommt der Parameter ''%%tankinhalt%%'' hinzu, der initialisiert werden muss. Im Quelltext kann man nun den Konstruktor der Elternklassse aufrufen: ''%%PKW.__init___(self,...)%%''. Dabei ist zu beachten, dass hier der Parameter ''%%self%%'' mit übergeben wird. Dadurch werden die Werte an alle lokalen Attribute außer ''%%tankinhalt%%'' übergeben. Im Anschluss wird nun nur noch der Wert an ''%%tankinhalt%%'' übergeben. # 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 # Hauptprogramm # Instanzen der Klasse Verbrenner-PKW wird erzeugt ford = VerbrennerPKW("Ford Focus",150,"weiß",30, 5, 50) tesla = ElektroPKW("Tesla Roadster",306,"blau",0, 2, 100) # Für die Objekte wird die Methode ausgabe() ausgeführt ford.ausgabe() print() tesla.ausgabe() =====Erklärvideo===== {{youtube>GNHu6nbZrN4}} \\ =====Aufgaben===== **Aufgabe 1** Teste die Klasse vererb.py! Erzeuge weitere Objekte und teste die Methoden! **Aufgabe 2** Gegeben ist eine Klasse Gebaeude: class Gebaeude: def __init__(self, bez, sw, r): self.bezeichnung = bez self.stockwerke = sw self.raeume = r def __str__(self): return "Bezeichnung: " + str(self.bezeichnung) + ", Stockwerke: " \ + str(self.stockwerke) + ", Räume: " + str(self.raeume) def ausgabe(self): print(self) Programmiere zwei weitere Klassen Krankenhaus und Schule die entsprechend dem Klassendiagramm von Gebaeude abgeleitet werden. {{ :python:obj:gebaeude.png?direct&400 |}} Schreibe in den abgeleiteten Klassen die Methoden ''%%__init__%%'' und ''%%__str__%%'' um, so dass jeweils das zusätzliche Attribut mit übergeben bzw. ausgegeben wird. Teste die neuen Klassen und ihre Methoden an eigenen Beispielen. [[python:loesungen:obj:vererb| >> Vererbung - Lösungen]] [[python:obj:mehrvererb| >> Mehrfachvererbung]] \\ ~~DISCUSSION | Hier können Fragen zum Inhalt der Seite gestellt werden. ~~