Python für Anfänger · Teil 19TutorialEinsteiger

Python

Python für Anfänger – Teil 19: Klassen und Objekte verständlich erklärt

Lerne den Grundgedanken der Objektorientierung an einer Filamentrolle kennen.

Veröffentlicht am

3 Minuten Lesezeit

Voraussetzungen

Du kennst die Inhalte aus Teil 18 und arbeitest mit einem lokalen Python-3-Interpreter (ab Python 3.10), beispielsweise in Thonny.

Das lernst du in dieser Lektion

  • Klasse und Instanz unterscheiden.
  • Attribute und Methoden verwenden.
  • Self und init einordnen.

Daten und Verhalten verbinden

Mit Dictionaries können wir eine Rolle bereits beschreiben. Eine Klasse kann zusätzlich festlegen, welche Operationen zu einer Rolle gehören. Für kleine Datensammlungen bleibt ein Dictionary oft die einfachere Lösung. Die Klasse ist eine weitere Möglichkeit, kein Pflichtumbau aller Programme.

class Filamentrolle:
    def __init__(self, material, rest_g):
        self.material = material
        self.rest_g = rest_g

    def beschreibung(self):
        return f"{self.material}: {self.rest_g:.1f} g"

rolle_a = Filamentrolle("PLA", 750)
rolle_b = Filamentrolle("PETG", 420)
print(rolle_a.beschreibung())
print(rolle_b.beschreibung())

Speichere als klassen.py. Die Klasse ist der Bauplan. Die beiden konkreten Rollen sind Instanzen, also Objekte dieser Klasse. Jede besitzt eigene Werte für material und rest_g.

self und Attribute

self ist der übliche Name für das aktuelle Objekt innerhalb einer Methode. self.rest_g bezeichnet dessen Restmenge. Python übergibt das Objekt bei einem Aufruf wie rolle_a.beschreibung() automatisch; du schreibst self nicht zusätzlich in die Aufrufklammern.

__init__() initialisiert die Instanz beim Erzeugen. Es setzt hier die Anfangswerte. Die doppelt unterstrichene Schreibweise ist vorgegeben. Die eigentliche Erzeugung des Objekts liegt technisch vor dieser Initialisierung.

Eine Methode mit Parameter

Füge innerhalb der Klasse auf derselben Ebene wie beschreibung() diese Methode ein:

    def verbrauchen(self, menge_g):
        if not 0 < menge_g <= self.rest_g:
            raise ValueError("Verbrauch muss positiv sein und in den Bestand passen.")
        self.rest_g -= menge_g

Ergänze danach außerhalb der Klasse:

rolle_a.verbrauchen(74)
print(rolle_a.beschreibung())
print(rolle_b.beschreibung())

Nur Rolle A wird verändert. Sie enthält nun 676.0 g; Rolle B bleibt bei 420.0 g. Die Methode kontrolliert für die hier verwendeten gewöhnlichen Zahlen, ob der Verbrauch zulässig ist. Eine umfassende Prüfung der Anfangswerte wäre ein nächster Ausbauschritt.

Welche Struktur passt?

Ein Tupel eignet sich für eine feste Wertegruppe, eine Liste für eine veränderliche Folge, ein Dictionary für benannte Eigenschaften. Eine eigene Klasse ist nützlich, wenn Daten und mehrere dazugehörige Regeln oder Aktionen zusammengehören.

Vererbung kann Klassen spezialisieren. Für unsere Filamentverwaltung brauchen wir sie noch nicht. Auch spezielle Werkzeuge wie Dataclasses sind mögliche spätere Themen.

Im Abschlussprojekt bleiben wir bei Listen und Dictionaries. So konzentrierst du dich beim Zusammenführen der Grundlagen auf Bedienung und Datenablage. Die Klassenlektion hilft dir, fremden Python-Code besser zu verstehen und später eine alternative Modellierung auszuprobieren.

Mitmach-Aufgabe

Erzeuge eine dritte Rolle mit 600 g. Verbrauche 100 g und gib alle drei Rollen aus. Prüfe in einem separaten Versuch, was bei 700 g Verbrauch passiert.

Versuche die Aufgabe zuerst selbst. Vergleiche danach deinen Ansatz mit der Musterlösung. Andere Lösungen sind möglich, wenn sie dieselben Anforderungen erfüllen.

Musterlösung

class Filamentrolle:
    def __init__(self, material, rest_g):
        self.material = material
        self.rest_g = rest_g

    def verbrauchen(self, menge_g):
        if not 0 < menge_g <= self.rest_g:
            raise ValueError("Ungültige Verbrauchsmenge")
        self.rest_g -= menge_g

    def beschreibung(self):
        return f"{self.material}: {self.rest_g:.1f} g"

rollen = [Filamentrolle("PLA", 750), Filamentrolle("PETG", 420), Filamentrolle("ASA", 600)]
rollen[2].verbrauchen(100)
for rolle in rollen:
    print(rolle.beschreibung())

Ergebnis prüfen

Die Mengen sind 750.0, 420.0 und 500.0 g. Ein zusätzlicher Verbrauch von 700 g bei der dritten Rolle löst ValueError aus und verändert ihre Menge nicht.

Typische Stolperstellen

Methoden sind innerhalb der Klasse eingerückt. Zwei Namen für dieselbe Instanz erzeugen keine Kopie. Eigene Objekte lassen sich nicht direkt mit json.dump speichern.

Was du jetzt kannst

  • Klasse und Instanz unterscheiden.
  • Attribute und Methoden verwenden.
  • Self und init einordnen.

Passendes Cheatsheet

Zum Nachschlagen: Cheatsheet 13 – Objektorientierte Programmierung mit Python. Dort findest du auch den vorhandenen PDF-Download.

Im nächsten Teil

In Teil 20 geht es um Abschlussprojekt vorbereiten: eine Filamentverwaltung. Plane Datenmodell, Menü und Prüffälle und entwickle einen ersten lauffähigen Zwischenschritt.

← Teil 18 · Kursübersicht · Weiter zu Teil 20 →