📚 LernsiteFach wählenKOLEFINAQUBAETFÜDIMAINFEINKMAEL ↗

🏛️ Klassen & Objekte

INF — Informatik (Python & Datenbanken) · Prof. Dr. Mehler · ~10 Aufgaben · Python + relationale Datenmodelle

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

  1. class Name: schreiben, Klassenname groß, Doppelpunkt am Ende.
  2. def __init__(self, p1, p2): = „Methode zur Initialisierung“.
  3. Darin je Attribut eine Zuweisung: self.attribut = p1.
  4. Weitere Methoden folgen, self steht dabei immer als 1. Parameter.
  5. Objekt erzeugen mit obj = Name(werte), Methode aufrufen mit obj.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:  2

Objekte 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
  • self im Methodenkopf vergessen.
  • self beim Aufruf mit angeben (falsch: r.berechne_flaeche(self)).
  • self.breite = breite vergessen; dann kennt das Objekt seine Werte nicht.
  • Das Objekt nie erzeugt und nichts ausgegeben.
  • Klassennamen klein geschrieben.