Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:obj:vererb

Vererbung

Zu Beginn betrachten wir wieder zwei Objekte mit gemeinsamen Eigenschaften:

Objekt: Ford Focus (Bildquelle)

  • Gewicht: 1,5 Tonnen
  • Leistung: 150 PS
  • Farbe: weiß
  • Geschwindigkeit: 30 km/h
  • Sitzplätze: 5

Objekt: Tesla Roadster (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:

Pythonquelltext

pkw.py
# 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.

vererb.py
# 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.

>> Vererbung - Lösungen

>> Mehrfachvererbung


Hier können Fragen zum Inhalt der Seite gestellt werden.

Geben Sie Ihren Kommentar ein. Wiki-Syntax ist zugelassen:
Q O N S Y
 
python/obj/vererb.txt · Zuletzt geändert: 2021/01/20 09:34 von lutz