4.6.3 Klassen Grundlagen

🐎 Erste eigene Klasse

Man kann sich eine Klasse wie einen Bauplan vorstellen: Eine Klasse beschreibt, wie ein späteres Objekt aussehen soll und was es kann. Wir erstellen also immer zuerst die Klasse, die aus Methoden (Funktionen einer Klasse) und Attributen (Variablen einer Klasse) besteht.

# Klasse Horse mit Hauptprogramm – print in Methode
# J. Thomaschewski, 04.09.2024
class Horse:
    def __init__(self, name):
        self.name = name
        self.beine = 4

    def wiehern(self):
        print('wiiieeeehrrr')

# Hauptprogramm
meinPferd = Horse("Lotte")
print(meinPferd.name)
meinPferd.wiehern()
  • In diesem Beispiel definieren wir mit dem Schlüsselwort class eine Klasse namens Horse.
  • Klassennamen beginnen IMMER mit einem Großbuchstaben.
  • Die Methode __init__ ist der sogenannte Konstruktor. Er wird automatisch aufgerufen, wenn ein neues Objekt (also ein konkretes Pferd) erzeugt wird.
  • self ist ein Verweis auf die Klasse selbst. Damit kann man Attribute (wie name oder beine) zugreifen oder sie erstellen.
  • Die Methode wiehern() beschreibt, was ein Pferd tun kann – nämlich wiehern.

Im Hauptprogramm wird dann ein konkretes Objekt meinPferd erzeugt, mit dem Namen "Lotte". Dieses Objekt hat: - einen Namen (meinPferd.name) - vier Beine (meinPferd.beine, wird hier nicht ausgegeben) - die Fähigkeit zu wiehern (meinPferd.wiehern()).

Wichtig

🧠 Merksatz: Eine Klasse ist wie ein Bauplan – das Objekt ist das fertige Produkt.

Konzept Beschreibung
Klasse Eine Vorlage (Bauplan) zur Erstellung von Objekten. Enthält Attribute und Methoden.
Attribut Eine Variable innerhalb einer Klasse, die den Zustand eines Objekts beschreibt.
Methode Eine Funktion, die in einer Klasse definiert ist.
Objekt Ein konkretes Exemplar einer Klasse. Auch Instanz genannt.
Instanz Synonym für Objekt: Ein durch eine Klasse erzeugter konkreter Datensatz.
Konstruktor Eine spezielle Methode (__init__), die beim Erzeugen eines Objekts automatisch aufgerufen wird.

🌳 Noch eine Klasse als Beispiel

Beispiel: Einfache Klasse - Ausgabe über print in der Methode

# Klasse Baum mit Hauptprogramm - print in Methode
# J. Thomaschewski, 04.09.2024
class Baum:
    def __init__(self, art, hoehe):
        self.art = art
        self.hoehe = hoehe

    def beschreibung(self):
        print(f"Baum: {self.art}, Höhe: {self.hoehe} Meter")

# Hauptprogramm
meinBaum = Baum("Eiche", 20)
meinBaum.beschreibung()

In diesem Beispiel wird eine Klasse Baum definiert, die die Attribute art und hoehe besitzt. Die Methode beschreibung() gibt die Details des Baumes aus, indem sie die Art und die Höhe des Baumes anzeigt.

Die Ausgabe erfolgt direkt in der Methode über den print-Befehl.

Beispiel: Einfache Klasse - Ausgabe über print im Hauptprogramm

# Klasse Baum mit Hauptprogramm - return
# J. Thomaschewski, 04.09.2024
class Baum:
    def __init__(self, art, hoehe):
        self.art = art
        self.hoehe = hoehe

    def beschreibung(self):
        return f"Baum: {self.art}, Höhe: {self.hoehe} Meter"

# Hauptprogramm
meinBaum = Baum("Eiche", 20)

beschreibung = meinBaum.beschreibung()
print(beschreibung)

Der String wird hier in der Methode mit return an das Hauptprogramm übergeben. Wenn eine Übergabe aus der MEthode erfolgt, dann muss diese im Hauptprogramm auch entgegengenommen werden. Dies erfolgt mit beschreibung =. Die Ausgabe erfolgt dann im Hauptprogramm über den print-Befehl.

Beispiel: Einfache Klasse - Der Baum wächst ja noch...

Im Konstruktor sollen nur "Werte" übergeben werden, die sich im Objekt nicht ändern. Die Höhe kann sich ja bei einer Eiche ber die Zeit noch ändern und ist damit kein gutes Klassenattribut.

# Klasse Baum mit Hauptprogramm - return
# J. Thomaschewski, 04.09.2024
class Baum:
    def __init__(self, art):
        self.art = art


    def beschreibung(self, hoehe):
        return f"Baum: {self.art}, Höhe: {hoehe} Meter"

# Hauptprogramm
meinBaum = Baum("Eiche")

beschreibung = meinBaum.beschreibung(20)
print(beschreibung)

Der String wird hier in der Methode mit return an das Hauptprogramm übergeben. Wenn eine Übergabe aus der MEthode erfolgt, dann muss diese im Hauptprogramm auch entgegengenommen werden. Dies erfolgt mit beschreibung =. Die Ausgabe erfolgt dann im Hauptprogramm über den print-Befehl.

📐 Beispiel: Klasse mit Methode zur Berechnung

# Klasse Kreis mit Hauptprogramm
# J. Thomaschewski, 04.09.2024
class Kreis:
    def __init__(self, radius):
        self.radius = radius

    def flaeche(self):
        return 3.14159 * (self.radius ** 2)

# Erstellen eines Objekts der Klasse und Aufruf der Methode
meinKreis = Kreis(5)
print(f"Die Fläche des Kreises ist: {meinKreis.flaeche()}")

In diesem Beispiel wird die Methode flaeche() verwendet, um die Fläche eines Kreises zu berechnen, basierend auf dem Radius, der beim Erstellen des Objekts angegeben wurde.

Einfache Aufgabe

Frage den Radius interaktiv über input() ab.

🔌 Pi Pico Script: Verwendung von Funktionen und Klassen

In diesem Beispiel kombinieren wir die Verwendung von Funktionen und Klassen, um eine LED am Pi Pico zu steuern.

# LED-Steuerung mit Funktionen und Klassen
# J. Thomaschewski, 04.09.2024
from machine import Pin
from time import sleep

class LedBlinker:
    def __init__(self, pinNumber):
        self.led = Pin(pinNumber, Pin.OUT)

    def blink(self, times, delay):
        for _ in range(times):
            self.led.on()
            sleep(delay)
            self.led.off()
            sleep(delay)

# Erstellen eines LED-Controllers
ledBlinker = LedBlinker('LED')

# LED blinken lassen
ledBlinker.blink(5, 0.5)

In diesem Beispiel wird eine Klasse LedBlinker erstellt, die eine LED steuern kann. Die Methode blink() lässt die LED eine bestimmte Anzahl von Malen blinken.

Wichtiger Hinweis

Die Besonderheit von for _ in diesem Kontext liegt darin, dass der Unterstrich (_) als Platzhalter für eine Variable verwendet wird, deren Wert im Schleifenrumpf nicht benötigt wird. Dies signalisiert, dass die Schleifenvariable ignoriert werden kann.

Aufgabe Funktionen zu Klassen

Nehmen Sie einen Sourcecode aus einem der Kapitel 3.1 - 3.6 und schreiben Sie den Sourcecode so um, dass eine Klasse genutzt wird.

Aufgabe

Erstellen Sie eine Klasse Ampel, die drei LEDs (rot, gelb, grün) steuert und die Farben entsprechend einer Ampelschaltung (rot -> gelb -> grün) umschaltet. Implementieren Sie eine Methode schalten(), die die Ampelschaltung durchführt.

Lösung
# Ampelsteuerung mit Klassen und Methoden
# Die Steuerung ist aber noch nicht "fertig". Hier nur rot -> grün
# J. Thomaschewski, 04.09.2024
from machine import Pin
from time import sleep

class Ampel:
    def __init__(self, rotPin, gelbPin, gruenPin):
        self.rot = Pin(rotPin, Pin.OUT)
        self.gelb = Pin(gelbPin, Pin.OUT)
        self.gruen = Pin(gruenPin, Pin.OUT)

    def schalten(self):
        self.rot.on()
        sleep(2)
        self.rot.off()
        self.gelb.on()
        sleep(1)
        self.gelb.off()
        self.gruen.on()
        sleep(2)
        self.gruen.off()

# Erstellen eines Ampel-Controllers
ampel = Ampel(15, 14, 13)

# Ampelschaltung durchführen
ampel.schalten()