it-praxisportal/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html

313 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kapitel 01: Einstieg in Klassen</title>
<link rel="stylesheet" href="../../assets/style.css">
</head>
<body>
<header>
<div class="header-container">
<nav class="nav-links">
<a href="../../index.html">🏠 Zur Kursübersicht</a>
<span>&rsaquo;</span>
<a href="../00_fehlersuche_und_grundlagen/index.html">Kapitel 00</a>
<span>&rsaquo;</span>
<span style="color: white; font-weight: 600;">Kapitel 01</span>
</nav>
<div class="header-badge">Kapitel 01</div>
<h1>Die erste Klasse: Bauplan vs. Objekt 🐶</h1>
<p>Verstehe den Unterschied zwischen einer Klasse und einer Instanz anhand vollständiger Praxisbeispiele.</p>
</div>
</header>
<main class="container">
<!-- 📂 Schnellzugriff & Download aller Dateien dieser Einheit -->
<div style="background: #ffffff; border: 1px solid var(--border-color); border-radius: var(--radius-md); padding: 14px 20px; margin-bottom: 25px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; box-shadow: var(--shadow-sm);">
<div style="font-weight: 700; color: var(--text-main); display: flex; align-items: center; gap: 8px;">
<span>📂 Dateien dieser Einheit:</span>
</div>
<div style="display: flex; gap: 10px; flex-wrap: wrap;">
<a href="aufgabe.py" class="btn" style="padding: 6px 14px; font-size: 0.88rem; background: var(--primary);" download>📄 aufgabe.py (Startercode)</a>
<a href="test_aufgabe.py" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>🧪 test_aufgabe.py (Tests)</a>
<a href="musterloesung.py" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>💡 musterloesung.py (Lösung)</a>
<a href="README.md" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;">📖 README.md</a>
</div>
</div>
<!-- 1. Theorie & Alltagsanalogie -->
<section class="card">
<h2>1. Die Grundidee: Bauplan vs. Echtes Objekt</h2>
<p>
In Python ist fast alles ein <strong>Objekt</strong> (Zahlen, Texte, Listen). Mit <strong>Klassen</strong> lernst du jetzt das mächtigste Werkzeug der Programmierung kennen: <strong>Deine eigenen Baupläne zu entwerfen!</strong>
</p>
<div class="box box-analogie">
<div class="box-title">🏗️ Die Plätzchenform-Analogie:</div>
<p>Stell dir das Backen in der Küche vor:</p>
<ul style="margin-left: 20px; margin-top: 8px;">
<li>Die <strong>Klasse (<code>class</code>)</strong> ist die <strong>Ausstechform</strong>. Sie legt die Form fest (Kopf, Arme, Beine). Die Form selbst kann man nicht essen.</li>
<li>Das <strong>Objekt (Instanz)</strong> ist das <strong>echte Plätzchen</strong>, das du aus dem Teig ausstichst. Ein Plätzchen bekommt Schokoglasur, ein anderes bunte Streusel. Beide stammen aus derselben Form, sind aber zwei völlig eigenständige Plätzchen!</li>
</ul>
</div>
</section>
<!-- 2. Vergleich: Vorher vs. Nachher -->
<section class="card">
<h2>2. Warum machen Klassen deinen Code besser?</h2>
<p>Schauen wir uns an, wie man Daten bisher mit Dictionaries gespeichert hat – und warum eine Klasse viel übersichtlicher und sicherer ist:</p>
<div class="code-container">
<div class="code-header">
<div class="code-dots">
<span class="code-dot dot-red"></span>
<span class="code-dot dot-yellow"></span>
<span class="code-dot dot-green"></span>
</div>
<span>❌ Vorher: Mit Dictionaries (Fehleranfällig!)</span>
</div>
<pre><span class="cm"># Hund 1 mit Dictionary</span>
<span class="var">hund1</span> = {<span class="str">"name"</span>: <span class="str">"Bello"</span>, <span class="str">"rasse"</span>: <span class="str">"Labrador"</span>, <span class="str">"alter"</span>: <span class="num">3</span>}
<span class="cm"># Hund 2: Ups! Hier haben wir uns beim Schlüssel vertippt ("tier_rasse" statt "rasse")!</span>
<span class="var">hund2</span> = {<span class="str">"name"</span>: <span class="str">"Luna"</span>, <span class="str">"tier_rasse"</span>: <span class="str">"Pudel"</span>, <span class="str">"alter"</span>: <span class="num">2</span>}
<span class="cm"># Wenn wir jetzt die Rasse ausgeben wollen:</span>
<span class="fn">print</span>(<span class="var">hund1</span>[<span class="str">"rasse"</span>]) <span class="cm"># Funktioniert -> "Labrador"</span>
<span class="fn">print</span>(<span class="var">hund2</span>[<span class="str">"rasse"</span>]) <span class="cm"># 💥 KeyError: 'rasse' existiert nicht! Programm stürzt ab!</span></pre>
</div>
<p>Jetzt das Ganze mit einer <strong>Klasse</strong>:</p>
<div class="code-container">
<div class="code-header">
<div class="code-dots">
<span class="code-dot dot-red"></span>
<span class="code-dot dot-yellow"></span>
<span class="code-dot dot-green"></span>
</div>
<span>✅ Nachher: Mit einer Klasse (Sauber &amp; Einheitlich)</span>
</div>
<pre><span class="cm"># 1. Wir definieren den gemeinsamen Bauplan:</span>
<span class="kw">class</span> <span class="fn">Hund</span>:
<span class="kw">pass</span>
<span class="cm"># 2. Wir erstellen zwei konkrete Hunde (Instanzen):</span>
<span class="var">bello</span> = <span class="fn">Hund</span>()
<span class="var">bello</span>.<span class="attr">name</span> = <span class="str">"Bello"</span>
<span class="var">bello</span>.<span class="attr">rasse</span> = <span class="str">"Labrador"</span>
<span class="var">bello</span>.<span class="attr">alter</span> = <span class="num">3</span>
<span class="var">luna</span> = <span class="fn">Hund</span>()
<span class="var">luna</span>.<span class="attr">name</span> = <span class="str">"Luna"</span>
<span class="var">luna</span>.<span class="attr">rasse</span> = <span class="str">"Pudel"</span>
<span class="var">luna</span>.<span class="attr">alter</span> = <span class="num">2</span>
<span class="cm"># 3. Jetzt greifen wir mit der Punkt-Notation (.) auf die Eigenschaften zu:</span>
<span class="fn">print</span>(<span class="var">bello</span>.<span class="attr">name</span>, <span class="str">"ist ein"</span>, <span class="var">bello</span>.<span class="attr">rasse</span>) <span class="cm"># Ausgabe: Bello ist ein Labrador</span>
<span class="fn">print</span>(<span class="var">luna</span>.<span class="attr">name</span>, <span class="str">"ist ein"</span>, <span class="var">luna</span>.<span class="attr">rasse</span>) <span class="cm"># Ausgabe: Luna ist ein Pudel</span></pre>
</div>
</section>
<!-- 3. Vollständiges, ausführliches Praxisbeispiel -->
<section class="card">
<h2>3. 🌟 Vollständiges Praxisbeispiel: Der Fahrrad-Verleih</h2>
<p>Hier siehst du ein vollständiges, funktionierendes Python-Skript von Anfang bis Ende. Schau dir genau an, wie Objekte erstellt, Eigenschaften zugewiesen und in Funktionen verwendet werden:</p>
<div class="code-container">
<div class="code-header">
<div class="code-dots">
<span class="code-dot dot-red"></span>
<span class="code-dot dot-yellow"></span>
<span class="code-dot dot-green"></span>
</div>
<span>Python (Komplettes Beispiel: fahrrad_verleih.py)</span>
</div>
<pre><span class="cm"># ==============================================================================</span>
<span class="cm"># SCHRITT 1: Die Klasse (der Bauplan) definieren</span>
<span class="cm"># ==============================================================================</span>
<span class="kw">class</span> <span class="fn">Fahrrad</span>:
<span class="kw">pass</span>
<span class="cm"># ==============================================================================</span>
<span class="cm"># SCHRITT 2: Eine Funktion, die Fahrräder beschreibt</span>
<span class="cm"># ==============================================================================</span>
<span class="kw">def</span> <span class="fn">fahrrad_info</span>(<span class="var">bike</span>):
<span class="cm"># Wir greifen über den Punkt auf die Attribute des übergebenen Objekts zu:</span>
<span class="kw">return</span> <span class="str">f"{bike.marke} ({bike.farbe}) - {bike.gaenge} Gänge - {bike.preis_pro_tag}€/Tag"</span>
<span class="cm"># ==============================================================================</span>
<span class="cm"># SCHRITT 3: Eine Funktion, die prüft, welches Fahrrad günstiger ist</span>
<span class="cm"># ==============================================================================</span>
<span class="kw">def</span> <span class="fn">guenstigeres_rad</span>(<span class="var">rad_a</span>, <span class="var">rad_b</span>):
<span class="kw">if</span> <span class="var">rad_a</span>.<span class="attr">preis_pro_tag</span> &lt; <span class="var">rad_b</span>.<span class="attr">preis_pro_tag</span>:
<span class="kw">return</span> <span class="var">rad_a</span>
<span class="kw">else</span>:
<span class="kw">return</span> <span class="var">rad_b</span>
<span class="cm"># ==============================================================================</span>
<span class="cm"># SCHRITT 4: Wir erzeugen konkrete Objekte und probieren alles aus!</span>
<span class="cm"># ==============================================================================</span>
<span class="kw">if</span> <span class="var">__name__</span> == <span class="str">"__main__"</span>:
<span class="cm"># Erstes Fahrrad-Objekt erstellen:</span>
<span class="var">mountainbike</span> = <span class="fn">Fahrrad</span>()
<span class="var">mountainbike</span>.<span class="attr">marke</span> = <span class="str">"Cube"</span>
<span class="var">mountainbike</span>.<span class="attr">farbe</span> = <span class="str">"Schwarz/Grün"</span>
<span class="var">mountainbike</span>.<span class="attr">gaenge</span> = <span class="num">21</span>
<span class="var">mountainbike</span>.<span class="attr">preis_pro_tag</span> = <span class="num">25.0</span>
<span class="cm"># Zweites Fahrrad-Objekt erstellen:</span>
<span class="var">citybike</span> = <span class="fn">Fahrrad</span>()
<span class="var">citybike</span>.<span class="attr">marke</span> = <span class="str">"Gazelle"</span>
<span class="var">citybike</span>.<span class="attr">farbe</span> = <span class="str">"Himmelblau"</span>
<span class="var">citybike</span>.<span class="attr">gaenge</span> = <span class="num">7</span>
<span class="var">citybike</span>.<span class="attr">preis_pro_tag</span> = <span class="num">15.0</span>
<span class="cm"># Infos ausgeben:</span>
<span class="fn">print</span>(<span class="str">"Verfügbare Räder:"</span>)
<span class="fn">print</span>(<span class="str">"1."</span>, <span class="fn">fahrrad_info</span>(<span class="var">mountainbike</span>))
<span class="fn">print</span>(<span class="str">"2."</span>, <span class="fn">fahrrad_info</span>(<span class="var">citybike</span>))
<span class="cm"># Günstigeres Rad finden:</span>
<span class="var">schnaeppchen</span> = <span class="fn">guenstigeres_rad</span>(<span class="var">mountainbike</span>, <span class="var">citybike</span>)
<span class="fn">print</span>(<span class="str">f"\nDas günstigere Rad ist das {schnaeppchen.marke} für nur {schnaeppchen.preis_pro_tag}€!"</span>)</pre>
</div>
<div class="box box-success">
<div class="box-title">💡 Was du hier sehen kannst:</div>
<code>mountainbike</code> und <code>citybike</code> sind zwei getrennte Variablen im Arbeitsspeicher. Jedes hat seine eigenen Werte für <code>.marke</code>, <code>.farbe</code> und <code>.preis_pro_tag</code>, obwohl beide aus der Klasse <code>Fahrrad</code> stammen!
</div>
</section>
<!-- 4. Stolperfallen -->
<section class="card">
<h2>4. ⚠️ Häufige Stolperfallen für Einsteiger</h2>
<div class="box box-warning">
<div class="box-title">1. Klammern beim Erstellen vergessen:</div>
<code>mein_rad = Fahrrad()</code> &nbsp;&check; (Richtig: Erzeugt ein neues Objekt!)<br>
<code>mein_rad = Fahrrad</code> &nbsp;&cross; (Falsch: Speichert nur den Bauplan in die Variable!)
</div>
<div class="box box-warning">
<div class="box-title">2. Groß- und Kleinschreibung:</div>
Klassennamen beginnen in Python immer mit einem <strong>Großbuchstaben</strong> (<code>Haustier</code>, <code>Fahrrad</code>). Variablen und Funktionsnamen schreibt man klein (<code>bello</code>, <code>erstelle_bello()</code>).
</div>
<div class="box box-danger">
<div class="box-title">3. 'return' in Funktionen vergessen:</div>
Wenn eine Funktion ein Haustier bauen soll (wie <code>erstelle_bello()</code>), muss am Ende <strong>unbedingt</strong> <code>return mein_tier</code> stehen! Ohne <code>return</code> gibt Python automatisch <code>None</code> zurück.
</div>
</section>
<!-- 5. Aufgabenstellung -->
<section class="card">
<h2>5. 🎯 Deine Aufgaben in <code><a href="aufgabe.py" style="color: inherit; text-decoration: underline;">aufgabe.py</a></code></h2>
<p>Öffne die Datei <code><a href="aufgabe.py" style="color: inherit; text-decoration: underline;">aufgabe.py</a></code> in deinem Editor und bearbeite die Aufgaben:</p>
<ul class="task-list">
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t1">
<label for="t1" class="task-label">
<strong>TODO 1:</strong> Definiere die Klasse <code>Haustier</code> mit <code>pass</code>.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t2">
<label for="t2" class="task-label">
<strong>TODO 2:</strong> Schreibe <code>erstelle_bello()</code>: Erzeuge ein Haustier-Objekt, setze <code>name="Bello"</code>, <code>tierart="Hund"</code>, <code>alter=3</code> und gib es mit <code>return</code> zurück.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t3">
<label for="t3" class="task-label">
<strong>TODO 3:</strong> Schreibe <code>erstelle_mimi()</code>: Erzeuge ein Haustier-Objekt, setze <code>name="Mimi"</code>, <code>tierart="Katze"</code>, <code>alter=5</code> und gib es zurück.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t4">
<label for="t4" class="task-label">
<strong>TODO 4:</strong> Schreibe <code>steckbrief_text(haustier)</code>: Gibt den formatierten Text <code>"{haustier.name} ist ein(e) {haustier.tierart} und ist {haustier.alter} Jahre alt."</code> zurück.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t5">
<label for="t5" class="task-label">
<strong>TODO 5:</strong> Schreibe <code>aelteres_tier(tier1, tier2)</code>: Vergleicht <code>tier1.alter</code> und <code>tier2.alter</code> und gibt das ältere Tier zurück (bei Gleichstand <code>tier1</code>).
</label>
</li>
</ul>
<h3>💡 Lösungshinweise (Aufklappen, wenn du Hilfe brauchst)</h3>
<details>
<summary>🔍 Tipp zu TODO 1 &amp; 2 (Klasse &amp; Objekt erstellen)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="kw">class</span> <span class="fn">Haustier</span>:
<span class="kw">pass</span>
<span class="kw">def</span> <span class="fn">erstelle_bello</span>():
<span class="var">tier</span> = <span class="fn">Haustier</span>() <span class="cm"># 1. Neues Haustier-Objekt bauen</span>
<span class="var">tier</span>.<span class="attr">name</span> = <span class="str">"Bello"</span> <span class="cm"># 2. Attribute zuweisen</span>
<span class="var">tier</span>.<span class="attr">tierart</span> = <span class="str">"Hund"</span>
<span class="var">tier</span>.<span class="attr">alter</span> = <span class="num">3</span>
<span class="kw">return</span> <span class="var">tier</span> <span class="cm"># 3. Objekt zurückgeben!</span></pre>
</div>
</div>
</details>
<details>
<summary>🔍 Tipp zu TODO 5 (Tiere vergleichen)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="kw">def</span> <span class="fn">aelteres_tier</span>(<span class="var">tier1</span>, <span class="var">tier2</span>):
<span class="kw">if</span> <span class="var">tier2</span>.<span class="attr">alter</span> > <span class="var">tier1</span>.<span class="attr">alter</span>:
<span class="kw">return</span> <span class="var">tier2</span>
<span class="kw">else</span>:
<span class="kw">return</span> <span class="var">tier1</span></pre>
</div>
</div>
</details>
</section>
<!-- 6. Testen & Navigation -->
<section class="card">
<h2>6. 🧪 Lösung überprüfen</h2>
<p>Öffne das Terminal und führe den Test aus:</p>
<div class="code-container">
<div class="code-header">
<span>Terminal</span>
</div>
<pre><code>python3 test_aufgabe.py</code></pre>
</div>
<div class="footer-nav">
<a href="../00_fehlersuche_und_grundlagen/index.html" class="btn btn-secondary">&larr; Zurück zu Kapitel 00</a>
<a href="../02_init_und_self/index.html" class="btn">Weiter zu Kapitel 02 &rarr;</a>
</div>
</section>
</main>
<!-- Lokale Gamification-Scripts (funktionieren auch offline per Doppelklick via file://) -->
<script src="../../assets/gamification_data.js"></script>
<script src="../../assets/gamification.js"></script>
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>