Klassen & Objekte
Status: GEPRÜFT, alle Beispiele mit Python 3.12 ausgeführt.
Begriffe
- Klasse = Bauplan / Schablone.
- Objekt / Instanz = konkretes Exemplar einer Klasse.
- Attribut = Eigenschaft (Variable) des Objekts.
- Methode = Funktion der Klasse.
- Konstruktor =
__init__, läuft automatisch beim Erzeugen eines Objekts. self= das aktuelle Objekt; steht als 1. Parameter in jeder Methode, wird beim Aufruf aber nie mit angegeben.
Klassennamen beginnen mit Großbuchstaben.
Grundgerüst
class Bruch:
│ def __init__(self, z, n): # Konstruktor
│ │ self.zaehler = z
│ │ self.nenner = n
│
│ def mult(self, anderer):
│ │ return Bruch(self.zaehler*anderer.zaehler,
│ │ self.nenner*anderer.nenner)
│
│ def __str__(self): # macht print(objekt) lesbar
│ │ return str(self.zaehler) + "/" + str(self.nenner)
b1 = Bruch(1, 2) # Objekt erzeugen
print(b1) # 1/2 (wegen __str__)
print(b1.zaehler) # Attribut mit Punkt
b3 = b1.mult(Bruch(1,4)) # Methode mit Punkt()Ohne __str__ gibt print(obj) nur die Speicheradresse aus. Zugriff auf Attribute und Methoden immer mit Punkt: objekt.attribut bzw. objekt.methode().
Die 5 Schritte zum Klassen-Bau
class Name:schreiben, Klassenname groß, Doppelpunkt am Ende.def __init__(self, p1, p2):= „Methode zur Initialisierung“.- Darin je Attribut eine Zuweisung:
self.attribut = p1. - Weitere Methoden folgen,
selfsteht dabei immer als 1. Parameter. - Objekt erzeugen mit
obj = Name(werte), Methode aufrufen mitobj.methode().
Klasse als Datentyp (Objekt in Objekt)
Ist eine Klasse in der Aufgabe vorgegeben (z. B. Punkt), schreibt man sie nicht ab. Man erzeugt nur ein Objekt davon und übergibt es als Attribut.
class Punkt:
│ def __init__(self, xkoord, ykoord):
│ │ self.x = xkoord
│ │ self.y = ykoord
│ def __str__(self):
│ │ return "x=" + str(self.x) + "/y=" + str(self.y)
class Rechteck:
│ def __init__(self, startpunkt, breite, hoehe):
│ │ self.startpunkt = startpunkt
│ │ self.breite = breite
│ │ self.hoehe = hoehe
│ def berechne_flaeche(self):
│ │ return self.breite * self.hoehe
s = Punkt(1, 1)
r = Rechteck(startpunkt=s, breite=1, hoehe=2)
print("Flaeche: ", r.berechne_flaeche()) # Flaeche: 2Objekte in einer Liste
class Kunde:
│ def __init__(self, name, ort):
│ │ self.name = name
│ │ self.ort = ort
k1 = Kunde("Jane", "Bingen")
k2 = Kunde("Alex", "Mainz")
liste = [k1, k2]
for kunde in liste:
│ print(kunde.name) # Jane / Alex⚠️ Punktekiller
selfim Methodenkopf vergessen.selfbeim Aufruf mit angeben (falsch:r.berechne_flaeche(self)).self.breite = breitevergessen; dann kennt das Objekt seine Werte nicht.- Das Objekt nie erzeugt und nichts ausgegeben.
- Klassennamen klein geschrieben.