Tagebuch-Eintrag #33
Klassen Vererbung
Letze Woche hatte ich mir die Klassen Grundlagen in Python verinnerlicht. Nun geht es um die Vererbung von Klassen weiter.
Ich muss schon sage, dass es schon etwas „komplexer“ ist, für jemanden, der noch nie Objekt-Orientierende-Programmierung gemacht hat. Es ist zugleich auch eine interessante Herausforderung sich mit diesem Thema auseinander zu setzen und ich möchte das ja auch, sonst hätte ich nicht mit Python lernen angefangen 😉
Außerdem hält den Kopf fit, wenn man etwas programmiert und das logische Denkvermögen richtig anwenden muss.
Jetzt aber zurück zum Thema Klassen vererben in Python
Das Grundprinzip von Vererbung in Klassen
Das Grundprinzip ist, dass man ein Objekt mit bestimmten Attribute/Eigenschaften erstellt. Und man möchte ein weiteres Objekt erstellen, was die gleichen Eigenschaften hat, jedoch auch andere, besondere Merkmale hat, die das ursprüngliche Objekt nicht hat. Anstatt den Code zu kopieren und für das zweite Objekt einzufügen und anzupassen, gibt es in Python (vermutlich auch in anderen Programmiersprachen ;)) die Möglichkeit der Vererbung. Das zweite Objekt greift im Code auf die Eigenschaften des Originals zurück und verwendet diese.
Soweit, die Theorie 😉
Für den Anfang habe ich irgendwelche Objekte definiert und „vererbt“, Menschen, Flugzeugtypen usw.
Ich habe den Code dann gelöscht und eine Tasse Kaffee gemacht noch mal eine Klasse mit Vererbung neu geschrieben. Am Anfang musste ich immer wieder auf die Anleitung zurückgreifen. Aber nach mehreren Übungen habe ich es mittlerweile verstanden, wie Vererbung funktioniert und wie der Code grundlegend geschrieben werden muss.
Dann hatte ich überlegt, welches Objekt ist realitätsnah?
Klasse Produkte mit Vererbung
Irgendwann kam ich auf die Idee Produkte als Klasse (also Objekt) anzulegen. Klar, es gibt so viele unterschiedliche Produkte. Also fing ich an.
Als erstes habe ich ein Standardprodukt (default) erstellt, welches als Attribut nur einen Namen zugewiesen wird. Das ist mein „Original“ und alle richtigen Produkte greifen auf dieses Attribute zurück. Klar, jedes Produkt hat auch einen Namen/eine Bezeichnung.
Anschließend erstelle ich die „echten“ Produkte, welches ich in unterschiedlichen Kategorien zuweise: Software, Hardware und Nahrung
- Software-Produkte haben neben dem Namen auch Betriebssysteme
- Hardare-Produkte hat auch die Attribute wie Software, zusätzlich Anschluss-Art
- Food-Produkte hat natürlich keine Betriebssystem und Anschlüsse und nutzt wiederum das Original-Prodult (default) und hat ein Attribut für Gewicht.
Alle Attribute werden im sogenannten Konstruktor __init__ vorab initialisiert, so dass das erstellt Objekt weiß, welche Werte zu erwarten sind.
Update: Ich habe für Konstruktor in Python einen eigenen Tagebuch-Eintrag gewidmet
Und das ist mein Python-Code für meine Produkte. Apfel und Banane werde als je eine Liste ausgeben.
# Das Default-Produkt nur mit dem Attribute für den Namen wird erstellt
class Product:
# Der Konstruktor wird mit dem Attribut name erstellt
def __init__(self, name):
self.name = name
def default(self):
return self.name
# Das Software-Produkt wird erstellt. Greift auf "Product"-Klasse zurück
class Software(Product):
# Der Konstruktor wird mit dem Attribut name und operating_system erstellt
def __init__(self, name, operating_system):
# super().__init__(name): Hole die Attribute aus Product-Klasse
super().__init__(name)
# Attribute operating_system wird angelegt
self.operating_system = operating_system
# Funktion zur Ausgabe der Informationen
def program(self):
return super().default() + " Betriebssystem: " + self.operating_system
# Das Hardware-Produkt wird erstellt. Greift auf "Software"-Klasse zurück
class Hardware(Software):
# Der Konstruktor wird mit den Attributten name und operating_system erstellt
def __init__(self, name, operating_system, connector):
# super().__init__(name): Hole die Attribute aus Software-Klasse
super().__init__(name, operating_system)
# Attribute connector wird angelegt
self.connector = connector
# Funktion zur Ausgabe der Informationen
def device(self):
return super().program() + " Anschluss: " + self.connector
# Das Food-Produkt wird erstellt. Greift auf "Product"-Klasse zurück - Also default
class Food(Product):
# Der Konstruktor wird mit dem Attribut name und weight erstellt
def __init__(self, name, weight):
# super().__init__(name): Hole die Attribute aus Product-Klasse
super().__init__(name)
# Attribute weight wird angelegt
self.weight = weight
# Funktion zur Ausgabe der Informationen.
def fruit(self):
# Rückgabe als Liste
return [super().default(), self.weight]
vs_code = Software("Visual Studio Code", "Windows, MacOS, Linux")
print(vs_code.program())
printer = Hardware("Printing Device", "Windows, MacOs, Linux", "USB, Bluetooth")
print(printer.device())
apple = Food("Apfel", "100g")
banana = Food("Banane", "50g")
print(apple.fruit())
print(banana.fruit())