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
1
2
3
4
5
6
7
8

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()
1
2
3
4
5
6
7
8
9
10

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()
1
2
3
4
5
6
7
8
9
10

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!")
1
2

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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19