Dieses Kapitel ist für Interessierte und Schnelle. Wir schauen darin zwei weitere Konzepte von OOP an:
Vererbung (inheritance)
Bei der Vererbung können Methoden und Eigenschaften einer Klasse weitergegeben werden. z.B. könnte die Klasse Dog
von Animal
erben, weil der Hund ja auch alle Eigenschaften eines Tieres hat. Die Klasse Dog
kann dann weitere «Hunde-spezifische» Dinge erledigen. Somit könnte auch eine Klasse Cat
von der Oberklasse Animal
erben.
class Animal():
pass
class Dog(Animal):
pass
class Cat(Animal):
pass
Datenkapselung (encapsulation)
Beim Prinzip der Datenkapselung geht es darum, dass wir gewisse Eigenschaften und Methoden nur innerhalb der Klasse verwenden und den Zugriff von aussen verbieten. Z.B. könnte unser Dog ein Geburtsdatum haben. Wir wollen aber nicht, dass dieses von aussen abgerufen werden kann oder gar geändert wird. Dafür könnte man von aussen z.B. eine Abfrage nach dem Alter des Hundes zulassen, die dann intern natürlich das Geburtsdatum verwendet.
protected
«Geschützte» Eigenschaften und Methoden (protected) werden mit einem Underscore beginnend benannt. In den erbenden Klassen kann darauf zugegriffen werden.
class Animal():
def __init__(self):
self._birthday = "today"
class Dog(Animal):
def sayBirthday(self):
print(self._birthday)
dog1 = Dog()
dog1.sayBirthday()
private
«Private» Eigenschaften und Methoden (private) werden mit einem doppelten Underscore beginnend benannt. Diese stehen in den Unterklassen nicht zur Verfügung.
class Animal():
def __init__(self):
self.__birthday = "today"
class Dog(Animal):
def sayBirthday(self):
print(self.__birthday)
dog1 = Dog()
dog1.sayBirthday()
Polymorphie (polymorphism)
Der Begriff «Polymorphismus» kommt aus dem Griechischen und steht für «Vielgestaltigkeit». Z.B. hat der Plus-Operator +
in Python mehrere Gestalten – je nachdem ob wir zwei Zahlen addieren oder zwei Strings zusammenhängen:
print(4 + 3)
print("Hallo" + " du!")
bei Klassen
In Python können wir verschiedene Objekte in eine Liste packen. Die Objekte der Klassen Dog
und Cat
haben beide eine gleich benannte Methode makeSound
. Wir können nun in einer Liste Objekte von Dog
und Cat
durchgehen und die Methode aufrufen. Dabei wird natürlich die jeweilig zum Objekt gehörende Methode ausgeführt.
class Dog():
def makeSound(self):
print("wuff")
class Cat():
def makeSound(self):
print("miau")
cat1 = Cat()
dog1 = Dog()
animals = [cat1, dog1]
for animal in animals:
animal.makeSound()
mit Vererbung
Besser ist es, wenn wir eine Superklasse Animal
definieren. Somit stellen wir sicher, dass die Methode makeSound
definiert ist. Dog
und Cat
erben dann von Animal
und können die Methode makeSound
überschreiben, also neu definieren.
class Animal():
def makeSound(self):
pass
class Dog(Animal):
def makeSound(self):
print("wuff")
class Cat(Animal):
def makeSound(self):
print("miau")
cat1 = Cat()
dog1 = Dog()
animals = [cat1, dog1]
for animal in animals:
animal.makeSound()