Klassen in Python sind Baupläne für Objekte, die wir mit ihnen schnell und einfach erstellen können.
Mit Hilfe von Klassen kann man in Python Baupläne für aller Art von Dingen erstellen. Nehmen wir uns mal als Beispiel den Bruch aus der Mathematik.
Ein Bruch besteht immer aus einem Zähler und einem Nenner. Welchen Wert dieser Bruch hat, wird dann noch festgelegt. Der Aufbau mit Zähler und Nenner ist der Bauplan für einen Bruch. Genau so einen Bauplan kann man in Python als eine Klasse definieren.
Wie erstellt man Klassen in Python?
class Bruch:
zaehler = 1
nenner = 1
- Wir schreiben class
- Darauf folgt der Name der Klasse, den wir uns selbst aussuchen. Es hat sich etabliert Klassen immer groß zu schreiben und ist daher zu empfehlen.
- Nach dem Namen folgt ein Doppelpunkt
- Eingerückt (4 Leerzeichen bzw. 1 Tabulator) folgen die Attribute.
Mit Hilfe von class erstellen wir eine Klasse namens Bruch. Hier sind Zähler und Nenner sogenannte Attribute der Klasse. Also einfacher gesagt die Werte, die in dieser Klasse gespeichert sind.
Wie erstellt man Objekte aus Klassen?
Eine Instanz einer Klasse ist ein nach dieser Klasse gebautes Objekt – in diesem Fall ist eine Instanz also ein Bruch, welcher mit Hilfe der Klasse Bruch, die wir erstellt haben, erzeugt wird.
Dies macht man in Python so:
mein_bruch = Bruch()
mein_bruch ist also eine Instanz von Bruch, die wir in einer Variable abspeichern. Von dieser können wir auf den Wert des Nenners und Zählers zugreifen, in dem wir hinter der Variable einfach den Namen des Attributs schreiben.
print(mein_bruch.zaehler)
### Output:
>>> 1
Der Wert ist hier 1, da alle Brüche zunächst mal den Wert 1 für Zähler und Nenner haben. Natürlich können wir diese Werte einfach für diese Instanz abändern, indem wir dem Zähler oder Nenner einen anderen Wert zuweisen.
mein_bruch.zaehler = 5
print(mein_bruch.zaehler)
### Output:
>>> 5
Input in Klassen mit Konstruktoren
Es ist etwas mühselig immer erst einen Bruch zu erstellen und danach die Werte abzuändern – deshalb gibt es sogenannte Konstruktoren, womit wir die Werte einer Instanz direkt festlegen können.
Das Ganze lässt sich ganz einfach mit def __init__(self) machen:
class Bruch:
def __init__(self, zaehler, nenner):
self.zaehler = zaehler
self.nenner = nenner
Wir schreiben in den Klammern von __init__ als aller erstes ein self und danach alle Variablen, die wir bei der Erstellung direkt mitgeben wollen. In diesem Falle schreiben wir also self, zaehler und nenner.
Was ist self in Python?
Self repräsentiert eine spezifische Instanz dieser Klasse. Immer wenn wir auf die Werte der Attribute zugreifen wollen, benötigen wir dieses self. Deswegen ist es sehr wichtig, dass Du das nicht vergisst! Denn ohne das self gilt die Variable für alle Instanzen dieser Klasse und das will man meistens nicht.
Wenn wir nun einen Bruch erstellen wollen, müssen wir darauf achten, dass man bei der Erstellung nicht vergisst, die Werte für den Zähler und Nenner mitzugeben! Ansonsten kriegen wir eine Fehlermeldung, dass nicht genügend Argumente – also Werte – vorhanden sind.
mein_bruch = Bruch(3, 5)
print(mein_bruch.zaehler)
print(mein_bruch.nenner)
### Output:
>>> 3
>>> 5
Standardwerte in Klassen
Vergessen wir aber die Werte einzugeben passiert das hier:
mein_bruch = Bruch()
### Output:
>>> TypeError: __init__() missing 2 required positional arguments:
'zaehler' and 'nenner'
Diesen Fehler können wir aber auch umgehen, indem wir dem zaehler und nenner Standardwerte zuweisen, also Werte, die dann genommen werden, wenn wir keine eigenen Werte angeben. Und zwar indem wir in den Klammern von __init__ diesen einen Wert zuweisen.
class Bruch:
def __init__(self, zaehler = 1, nenner = 2):
self.zaehler = zaehler
self.nenner = nenner
Und dann funktioniert es auch wieder wunderbar ohne Werte anzugeben.
mein_bruch = Bruch()
print(mein_bruch.zaehler)
### Output:
>>> 1
Vererbung in Python
Ein weiterer wichtiger Punkt in Bezug auf Klassen ist die Vererbung. Das heißt, wie man es kennt, dass bestimmte Eigenschaften weitervererbt werden. Im echten Leben erbt das Kind von den Eltern – hier in Python eine Klasse von einer anderen Klasse. Hierbei übernimmt die erbende Klasse alles von der vererbenden Klasse.
Ein kleines Beispiel hier:
Ein Mensch hat einen Namen und Vornamen und ein Mitarbeiter ist ein Mensch, der noch zusätzlich eine Mitarbeiternummer hat.
Erstellen wir zunächst mal die Klasse für den Menschen:
class Mensch:
def __init__(self, nachname, vorname):
self.nachname = nachname
self.vorname = vorname
Wir möchten eine weitere Klasse erstellen, die die Informationen von der Klasse Mensch erben soll:
class Mitarbeiter(Mensch):
def __init__(self, nachname, vorname, mitarbeiter_nr):
super().__init__(nachname, vorname)
self.mitarbeiter_nr = mmitarbeiter_nr
Wir schreiben hinter dem Namen von der erbenden Klasse [Mitarbeiter] in Klammern den Namen der vererbenden Klasse [Mensch]. In den Konstruktor, also in die Klammer der __init__ schreiben wir alle Attribute, die auch der Mensch hat und zusätzlich die Mitarbeiternummer.
Mit super().__init__() greifen wir auf die __init__ von der vererbenden Klasse [Mensch] zu. Sie erstellt quasi den Mensch-Teil der Mitarbeiter Klasse. Dort müssen wir dann natürlich alle Werte übergeben, die die Mensch Klasse benötigt. Anschließend speichern wir noch zusätzlich die Mitarbeiternummer.
So sieht das dann aus, wenn wir Instanzen von den beiden Klassen anlegen und einfach mal die Werte ausgeben:
mensch1 = Mensch("Anna", "Conda")
print(mensch1.vorname)
print(mensch1.nachname)
mitarbeiter1 = Mitarbeiter("Ju", "Pyter", 42)
print(mitarbeiter1.vorname)
print(mitarbeiter1.nachname)
print(mitarbeiter1.mitarbeiter_nr)
### Output:
>>> Anna
>>> Conda
>>> Ju
>>> Pyter
>>> 42