======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. ~~