Klassen

Wenn Programme an Größe und Komplexität zunehmen, kann es eine Herausforderung sein, den Code zu verwalten und zu organisieren. Funktionen und Variablen könnten über verschiedene Teile eines Programms verstreut sein, was es schwierig macht, den Überblick zu behalten und zu unordentlichem, schwer wartbarem Code führt. Hier kommen Klassen ins Spiel, ein Grundpfeiler der objektorientierten Programmierung.
💡
Klassen sind eine Möglichkeit, zusammengehörige Daten und Funktionen zu bündeln und sogenannte "Objekte" zu erstellen. Klassen sind grundlegende Konzepte in der objektorientierten Programmierung (OOP).
Klassen sind wie Baupläne zum Erstellen von Objekten in unserem Code. Jede Klasse fasst zugehörige Eigenschaften (Daten) und Methoden (Funktionen) in einer Einheit zusammen. In einem Spielprogramm könnten Sie zum Beispiel Klassen wie Player, Monster oder Item haben, die jeweils ihre eigenen relevanten Daten und Methoden enthalten. Dies erleichtert das Verständnis und die Verwaltung großer Codebasen, da verwandte Funktionalitäten gruppiert sind und es klar wird, wie sie miteinander interagieren.
Angenommen, Sie möchten eine Software erstellen, um eine Bibliothek zu modellieren. In Ihrer Bibliothek gibt es Bücher, daher müssen Sie eine Book-Klasse erstellen:
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # Weist der Buchinstanz den Titel zu
        self.author = author   # Weist der Buchinstanz den Autor zu
        self.pages = pages     # Weist der Buchinstanz die Seitenzahl zu
Das Schlüsselwort class führt eine neue Klasse ein, gefolgt von ihrem Namen (Book). Die Zeile def __init__(self, title, author, pages): definiert den Anfangszustand der Klasse oder den Konstruktor. Hier wird das Objekt initialisiert. self bezieht sich auf die Instanz der Klasse. title, author und pages sind Attribute der Klasse.
Sie können ein neues Buchobjekt erstellen, indem Sie die Klasse wie eine Funktion aufrufen:
# Erstellen Sie eine neue Instanz von Book
mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)

print(mockingbird.title)   # To Kill a Mockingbird
print(mockingbird.author)  # Harper Lee
print(mockingbird.pages)   # 281
Beachten Sie, dass wir To Kill a Mockingbird, Harper Lee und 281 als Argumente übergeben. Diese werden an die __init__-Methode übergeben (ähnlich wie bei einer normalen Funktion).
Wir können mehrere Instanzen der Book-Klasse erstellen:
# Erstellen weiterer Buchinstanzen
book2 = Book('1984', 'George Orwell', 328)
book3 = Book('The Great Gatsby', author='F. Scott Fitzgerald', pages=180)
book4 = Book('Moby Dick', 'Herman Melville', pages=720)

# Drucken Sie einige Informationen über die Bücher
print(f'{book2.title} by {book2.author} has {book2.pages} pages.')  # 1984 by George Orwell has 328 pages.
print(f'{book3.title} by {book3.author} has {book3.pages} pages.')  # The Great Gatsby by F. Scott Fitzgerald has 180 pages.
print(f'{book4.title} by {book4.author} has {book4.pages} pages.')  # Moby Dick by Herman Melville has 720 pages.
Wie bei Funktionen können wir sowohl Positions- als auch Schlüsselwortargumente an die __init__-Methode übergeben.
Neben Daten können Klassen auch Funktionalität kapseln. Angenommen, wir möchten in unserem Bibliothekssystem ein Buch als gelesen markieren. Wir können zu diesem Zweck eine Methode in unserer Book-Klasse definieren:
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # Weist der Buchinstanz den Titel zu
        self.author = author   # Weist der Buchinstanz den Autor zu
        self.pages = pages     # Weist der Buchinstanz die Seitenzahl zu
        self.is_read = False   # Buch wurde noch nicht gelesen

    def mark_as_read(self):    # Eine Klassenmethode
        self.is_read = True    # Markiere das Buch als gelesen


mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)
print(mockingbird.is_read)   # False, Buch wurde noch nicht gelesen
mockingbird.mark_as_read()   # Markiere das Buch als gelesen
print(mockingbird.is_read)   # True, Buch wurde gelesen
Die Methode mark_as_read ändert den Zustand des Attributs is_read zu True. Wir können diese Methode auf jeder Buchinstanz aufrufen. Dies zeigt, wie wir mit Klassen in Python zusammengehörige Daten und Funktionalität bündeln können.
💡
In Python ist self ein konventioneller Name für den ersten Parameter in Instanzmethoden einer Klasse. Es ist eine Referenz auf die aktuelle Instanz der Klasse. self wird verwendet, um innerhalb der Klassendefinition auf die Attribute und Methoden der Klasse zuzugreifen. Wenn Sie ein neues Objekt der Klasse erstellen, bindet Python das self-Argument automatisch an dieses neue Objekt, weshalb Sie self nicht übergeben müssen, wenn Sie eine Instanzmethode aufrufen. Obwohl self kein reserviertes Schlüsselwort in Python ist, wird es wegen seines klaren und lesbaren Stils weithin verwendet. Es ist wichtig zu beachten, dass Sie auch einen anderen Namen verwenden könnten, aber die Verwendung von self wird von der Community dringend empfohlen und gilt als Best Practice.

Herausforderung: Erstellen Sie eine Car-Klasse

Ihre Aufgabe besteht darin, eine Car-Klasse zu erstellen, die die folgenden Attribute enthält:
  • color (die Farbe des Autos)
  • make (die Marke des Autos)
  • model (das spezifische Modell des Autos)
  • year (das Baujahr)
Diese Attribute sollten in der __init__-Methode der Klasse initialisiert werden.
Zusätzlich sollte die Car-Klasse eine Methode display_details haben. Diese Methode sollte eine Zeichenketten-Darstellung der Autodetails im Format [year] [color] [make] [model] zurückgeben.
Eingabe
Ausgabe
c = Car('red', 'Ferrari', 'F8', 2023); print(c.display_details())
2023 red Ferrari F8
c = Car('black', 'Tesla', 'Model S', 2021); print(c.display_details())
2021 black Tesla Model S
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue