Variablen (Unterschied zu Eigenschaften) in Klassen nutzen
In der „normalen“ Programmierung spricht man viel über Variablen – was kann man nun in Klassen damit anstellen (es sind nicht die Eigenschaften gemeint!)
Unsere Oberklasse „Tier“ bekommt eine Variable gleich nach der Anlage der Klasse:
class Tier():
""" Beispiel für Variablen in Klassen """
tieranzahl = 0
def __init__(self, rufname):
self.rufname = rufname
def anzahl_tiere(self):
print(" aktuelle Anzahl: ", Tier.tieranzahl)
Zusätzlich können wir und die Anzahl der Tiere über die Methode anzahl_tiere()
ausgeben lassen.
Unsere Kindklassen „Katze“ und „Hund“ greifen auf die Variable gleich am Anfang zu und lassen diese ausgeben:
class Tier():
""" Beispiel für Variablen in Klassen """
tieranzahl = 0
def __init__(self, rufname):
self.rufname = rufname
def anzahl_tiere():
print("aktuelle Anzahl: ", Tier.tieranzahl)
class Katze(Tier):
""" Klasse für das Erstellen von Katzen """
print("Aus Klasse Katze: ", Tier.tieranzahl)
def __init__(self, rufname):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname)
class Hund(Tier):
""" Klasse für das Erstellen von Hunden """
print("Aus Klasse Hund: ", Tier.tieranzahl)
def __init__(self, rufname):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname)
Tier.anzahl_tiere()
Als Ergebnis erhalten wir:
Aus Klasse Katze: 0
Aus Klasse Hund: 0
aktuelle Anzahl: 0
Man sieht hier sehr schön, dass der „Kopfbereich“ der Klassen auf jeden Fall ausgeführt werden. Somit erhalten wir sofort die Ausgabe „Aus Klasse Katze: 0“ und dasselbe beim Hund. Erst dann rufen wir die Methode Tier.anzahl_tiere()
auf.
Wir könnten die Variable auf außerhalb direkt abfragen
print(Tier.tieranzahl)
Und natürlich können wir überall die Variable setzen (auch außerhalb der Klassen und die Anzahl innerhalb der Klasse würde sich ändern!). Einfach einmal probieren.
Tier.anzahl_tiere()
print(Tier.tieranzahl)
Tier.tieranzahl = 5
Tier.anzahl_tiere()
Nutzwert von Variablen in Klassen
Mit diesem Wissen können wir die Anzahl der generierten (sprich instanziierten) Objekte sehr einfach erfassen.
Jedes Mal, wenn wir ein neues Objekt erstellen, wird die __init__
durchlaufen. Wenn wir nun in beide (sowohl bei Hund wie Katze) dieses Variable erhöhen, können wir jederzeit die Gesamtanzahl der aktuell erstellten Objekte (sprich wie viele Hunde und Katzen gibt es insgesamt) abfragen:
class Katze(Tier):
""" Klasse für das Erstellen von Katzen """
print("Aus Klasse Katze: ", Tier.tieranzahl)
def __init__(self, rufname):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname)
Tier.tieranzahl += 1
Und nun basteln wir Tiere – sprich wir erzeugen Objekte in Form von einer Katze und zwei Hunden:
Tier.anzahl_tiere()
katze_schnurri = Katze("Schnurri")
print(katze_schnurri.rufname)
Tier.anzahl_tiere()
hund_bello = Hund("Bello")
print(hund_bello.rufname)
Tier.anzahl_tiere()
hund_wedler = Hund("Wedler")
print(hund_wedler.rufname)
Tier.anzahl_tiere()
Als Ausgabe erhalten wir:
aktuelle Anzahl: 0
Schnurri
aktuelle Anzahl: 1
Bello
aktuelle Anzahl: 2
Wedler
aktuelle Anzahl: 3
Zur Sicherheit der komplette Code:
class Tier():
""" Beispiel für Variablen in Klassen """
tieranzahl = 0
def __init__(self, rufname):
self.rufname = rufname
def anzahl_tiere():
print("aktuelle Anzahl: ", Tier.tieranzahl)
class Katze(Tier):
""" Klasse für das Erstellen von Katzen """
# print("Aus Klasse Katze: ", Tier.tieranzahl)
def __init__(self, rufname):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname)
Tier.tieranzahl += 1
class Hund(Tier):
""" Klasse für das Erstellen von Hunden """
# print("Aus Klasse Hunde: ", Tier.tieranzahl)
def __init__(self, rufname):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname)
Tier.tieranzahl += 1
Tier.anzahl_tiere()
katze_schnurri = Katze("Schnurri")
print(katze_schnurri.rufname)
Tier.anzahl_tiere()
hund_bello = Hund("Bello")
print(hund_bello.rufname)
Tier.anzahl_tiere()
hund_wedler = Hund("Wedler")
print(hund_wedler.rufname)
Tier.anzahl_tiere()