Vererbung

Zu Beginn betrachten wir wieder zwei Objekte mit gemeinsamen Eigenschaften:

Objekt: Ford Focus (Bildquelle) Gewicht: 12 Tonnen Leistung: 150 PS Farbe: weiß Geschwindigkeit: 30 km/h Sitzplätze: 5	Objekt: Tesla Roadster (Bildquelle) Gewicht: 26 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:

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:

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

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.

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.