Class
Klassen werden benutzt, um eigene, neue Datentypen zu erstellen. Klassen sind dabei extrem mächtig und egal was du programmierst, irgendwann willst du Klassen benutzen, um dein Code zu vereinfachen und besser zu strukturieren.
Lass uns eine "Personen" Klasse erstellen, der wir einen Namen geben können und damit kann sie sich selber vorstellen, indem sie eine Begrüßungstext in die Konsole ausgibt.
class Person:
def __init__(self, name):
self.name = name
def greeting(self):
print("Hi my name is", self.name)
Ich erkläre gleich den Code nochmal genauer, aber zu erst lass uns eine Person erstellen und führen dann die "greeting" Funktion aus.
michael = Person("michael")
michael.greeting()
Hia my name is Michael
Hier haben wir die Variable michael erstellt.
Michael ist eine Instanz der Klasse Person,
dies nennt man auch Objekt.
Also michael ist ein Objekt von der Klasse Person.
Die Klasse Person gibt uns die Funktion greeting zur Verfügung.
Die Funktion greeting wurde mit self markiert,
dadurch können wir auf die Instanz von michael zugreifen.
Das müssen wir machen, weil sonst kommen wir nicht an die Variable name,
die in der __init__ Funktion mit self.name erstellt worden ist.
Aber was zur Hölle ist __init__?!
__init__ ist die aller erste Funktion,
die automatisch beim Erstellen eines neuen Objektes der Klasse ausgeführt wird.
Sprich wenn wir Person() aufrufen, dann wird __init__ auch aufgerufen.
Die __init__ Funktion braucht eigentlich nur einen Parameter,
und zwar self.
self ist dabei die Instanz, die wir gerade erstellen wollen.
Wir brauchen self um Werte,
die wir in der Klasse gespeichert haben wollen,
zu erstellen.
So wie ich es bei der Klasse "Person" gemacht habe.
def __init__(self, name):
self.name = name
Hier __init__(self, name) sage ich,
wenn wir eine neue Person erstellen wollen,
dann will ich auch einen Namen.
Deswegen haben wir Person("michael") oben geschrieben.
"michael" wird der __init__ Funktion weiter gegeben.
Mit self.name = name nehme ich den weitergegebenen Namen und speicher den in self ab,
also bei der Instanz der Klasse, die ich gerade erstelle.
Dadurch kann ich dann in greeting auch auf diesen Namen mit self.name zugreifen.
Wir müssen dafür Python aber auch sagen, dass greeting auf "sich selber" zugreifen möchte
und das machen wir indem wir als ersten Funktionparameter self schreiben.
Wenn eine Funktion self hat, dann können wir nicht nur auf Variablen wie name zugreifen,
sondern wir könnten auch name ändern.
Lass dafür eine change_name Funktion erstellen.
class Person:
def __init__(self, name):
self.name = name
def greeting(self):
print("Hi my name is", self.name)
def change_name(self, new_name):
self.name = new_name
michael = Person("michael")
michael.greeting()
michael.change_name("leon")
michael.greeting()
Hi my name is michael
Hi my name is leon
Eine Funktion muss aber nicht immer self haben.
Wenn eine Funktion self hat, dann wird diese auf das erstellte Objekt aufgerufen,
wie wir es mit "michael" auch gemacht haben:
michael.greeting()
michael.change_name("leon")
michael.greeting()
Zum Beispiel lass eine Funktion auf der Klasse "Person" schreiben,
die kein self benutzt und in die Konsole ausgibt, welche Spezies an Tier eine Person ist.
In einfachen Worten: Gebe "Human" in die Konsole aus.
class Person:
# ...
def species():
print("Human")
Funktionen ohne self können wir entweder auf das erstellte Objekt von Person aufrufen,
oder direkt von der Klasse Person. Also so:
michael.species()
Person.species()
Human
Human
Dadurch dass die Funktion species nicht self benutzt,
können wir diese aufrufen ohne eine neue Instanz davon zu erstellen.
Also es ist egal wo wir es aufrufen.
Du kannst es so machen wir du bock hast.
Und das ist im Grunde genommen alles wichtige, wenn es um Klassen in Python geht. In den nächsten Kapitel zeige ich dir noch wie man Logik von einer Klasse in eine andere Klasse weiter vererben kann.