285 lines
15 KiB
HTML
285 lines
15 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="de">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Python OOP Lernportal: Klassen & Objekte</title>
|
||
<link rel="stylesheet" href="assets/style.css">
|
||
</head>
|
||
<body>
|
||
|
||
<header>
|
||
<div class="header-container">
|
||
<div class="header-badge">🐍 Python Nachhilfe & Selbstlern-Kurs</div>
|
||
<h1>Objektorientierte Programmierung (OOP)</h1>
|
||
<p>Lerne Schritt für Schritt, wie du eigene Klassen baust, Methoden nutzt und professionell mit Git & Unit Tests arbeitest.</p>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="container">
|
||
|
||
<!-- Willkommen Card -->
|
||
<section class="card">
|
||
<h2>👋 Willkommen zu deiner Übungsreihe!</h2>
|
||
<p>
|
||
Dieser Kurs begleitet dich durch die gesamte Objektorientierte Programmierung in Python – exakt abgestimmt auf dein Schulskriptum, aber mit viel mehr Erklärungen, Analogien, Visualisierungen und automatischen Tests!
|
||
</p>
|
||
|
||
<div class="box box-analogie">
|
||
<div class="box-title">🏗️ Die Grundidee von OOP in einem Satz:</div>
|
||
Eine <strong>Klasse</strong> ist wie ein Bauplan (oder eine Plätzchen-Ausstechform). Ein <strong>Objekt</strong> ist das fertige Haus (oder das gebackene Plätzchen), das nach diesem Bauplan entstanden ist!
|
||
</div>
|
||
|
||
<div class="box box-tipp">
|
||
<div class="box-title">📚 Schulabgleich & Lehrplan:</div>
|
||
Alle Kapitel sind 1:1 mit den Themen deines Informatik-Unterrichts (Type Hints, UML, Assoziationen, Referenzen, Vererbung, Tkinter) abgestimmt. Ausführlicher Plan in <a href="LEHRPLAN.md" style="color: var(--primary); font-weight: bold;">LEHRPLAN.md</a>.
|
||
</div>
|
||
</section>
|
||
|
||
<!-- PHASE 1: GRUNDLAGEN & WERKZEUGE -->
|
||
<section>
|
||
<h2 style="margin: 30px 0 10px 0; color: var(--text-main); font-size: 1.4rem;">🌱 Phase 1: Grundlagen OOP & Entwickler-Werkzeuge</h2>
|
||
<div class="roadmap-grid">
|
||
|
||
<!-- Kapitel 0 -->
|
||
<a href="00_fehlersuche_und_grundlagen/index.html" class="roadmap-card" style="border-left: 4px solid var(--purple);">
|
||
<div>
|
||
<span class="roadmap-number" style="background: var(--purple-light); color: var(--purple);">Warm-up 00</span>
|
||
<div class="roadmap-title">🔍 Fehlersuche & Bugs</div>
|
||
<div class="roadmap-desc">Tracebacks richtig lesen, Einrückungsfehler (IndentationError), Typfehler und Detektiv-Aufgabe.</div>
|
||
</div>
|
||
<div class="roadmap-footer">Vorkapitel öffnen →</div>
|
||
</a>
|
||
|
||
<!-- Kapitel 1 -->
|
||
<a href="01_einstieg_klassen/index.html" class="roadmap-card">
|
||
<div>
|
||
<span class="roadmap-number">Kapitel 01</span>
|
||
<div class="roadmap-title">🐶 Die erste Klasse</div>
|
||
<div class="roadmap-desc">Bauplan vs. Objekt, Instanziierung, Punktnotation und Type Hints am Fahrrad- & Haustier-Beispiel.</div>
|
||
</div>
|
||
<div class="roadmap-footer">Kapitel öffnen →</div>
|
||
</a>
|
||
|
||
<!-- Kapitel 2 -->
|
||
<a href="02_init_und_self/index.html" class="roadmap-card">
|
||
<div>
|
||
<span class="roadmap-number">Kapitel 02</span>
|
||
<div class="roadmap-title">💳 Konstruktor & self</div>
|
||
<div class="roadmap-desc">Wie <code>__init__</code> Objekte startklar macht, was <code>self</code> bedeutet und erste UML-Klassendiagramme.</div>
|
||
</div>
|
||
<div class="roadmap-footer">Kapitel öffnen →</div>
|
||
</a>
|
||
|
||
<!-- Kapitel 3 -->
|
||
<a href="03_methoden_und_verhalten/index.html" class="roadmap-card">
|
||
<div>
|
||
<span class="roadmap-number">Kapitel 03</span>
|
||
<div class="roadmap-title">⚔️ Methoden & Verhalten</div>
|
||
<div class="roadmap-desc">Objekte führen Aktionen aus! Interaktion zwischen Objekten in Rennautos und RPG-Heldenduellen.</div>
|
||
</div>
|
||
<div class="roadmap-footer">Kapitel öffnen →</div>
|
||
</a>
|
||
|
||
<!-- Kapitel 4 -->
|
||
<a href="04_str_und_darstellung/index.html" class="roadmap-card">
|
||
<div>
|
||
<span class="roadmap-number">Kapitel 04</span>
|
||
<div class="roadmap-title">🧾 Schöne Textausgabe</div>
|
||
<div class="roadmap-desc">Wie man <code>print(objekt)</code> mit <code>__str__</code> lesbar macht und Rechnungsdruck im Warenkorb.</div>
|
||
</div>
|
||
<div class="roadmap-footer">Kapitel öffnen →</div>
|
||
</a>
|
||
|
||
<!-- Kapitel 4b -->
|
||
<a href="04b_umstieg_vscode/index.html" class="roadmap-card" style="border-left: 4px solid var(--secondary);">
|
||
<div>
|
||
<span class="roadmap-number" style="background: #e0f2fe; color: #0284c7;">Exkurs 04b</span>
|
||
<div class="roadmap-title">🚀 Umstieg & Installation VS Code</div>
|
||
<div class="roadmap-desc">Installationsanleitung (Win/Mac/Linux), Plugins (Error Lens, Python), Shortcuts & Terminal.</div>
|
||
</div>
|
||
<div class="roadmap-footer">VS Code Guide öffnen →</div>
|
||
</a>
|
||
|
||
<!-- Kapitel 4c (Git) -->
|
||
<a href="04c_git_und_versionskontrolle/index.html" class="roadmap-card" style="border-left: 4px solid var(--success);">
|
||
<div>
|
||
<span class="roadmap-number" style="background: var(--success-light); color: var(--success);">Exkurs 04c</span>
|
||
<div class="roadmap-title">🌿 Git & Versionskontrolle</div>
|
||
<div class="roadmap-desc">Die Programmier-Zeitmaschine: Spielstände (Commits) sichern, Diffs in VS Code, Terminal-Befehle & Push.</div>
|
||
</div>
|
||
<div class="roadmap-footer">Git Guide öffnen →</div>
|
||
</a>
|
||
|
||
<!-- Kapitel 5 -->
|
||
<a href="05_objekte_kombinieren/index.html" class="roadmap-card">
|
||
<div>
|
||
<span class="roadmap-number">Kapitel 05</span>
|
||
<div class="roadmap-title">🎵 Assoziation & Komposition</div>
|
||
<div class="roadmap-desc">Objekte verwalten andere Objekte: Song-Suche, Längenberechnung und Filter in Spotify-Playlists.</div>
|
||
</div>
|
||
<div class="roadmap-footer">Kapitel öffnen →</div>
|
||
</a>
|
||
|
||
<!-- Kapitel 6 -->
|
||
<a href="06_abschlussprojekt_tamagotchi/index.html" class="roadmap-card">
|
||
<div>
|
||
<span class="roadmap-number">Kapitel 06</span>
|
||
<div class="roadmap-title">🥚 Mini-Projekt: Tamagotchi</div>
|
||
<div class="roadmap-desc">Kombiniere alles in einem voll spielbaren, interaktiven virtuellen Haustier für dein Terminal!</div>
|
||
</div>
|
||
<div class="roadmap-footer">Kapitel öffnen →</div>
|
||
</a>
|
||
|
||
</div>
|
||
</section>
|
||
|
||
<!-- PHASE 2: FORTGESCHRITTENES OOP -->
|
||
<section>
|
||
<h2 style="margin: 35px 0 10px 0; color: var(--text-main); font-size: 1.4rem;">🧠 Phase 2: Fortgeschrittenes OOP, Testing & Persistenz</h2>
|
||
<div class="roadmap-grid">
|
||
|
||
<!-- Kapitel 7 -->
|
||
<a href="07_referenzen_und_speicher/index.html" class="roadmap-card" style="border-left: 4px solid var(--success);">
|
||
<div>
|
||
<span class="roadmap-number" style="background: var(--success-light); color: var(--success);">Kapitel 07</span>
|
||
<div class="roadmap-title">🌳 Referenzen & Stammbäume</div>
|
||
<div class="roadmap-desc">Speicherbereiche im RAM, Aliasing (<code>b = a</code>), <code>is</code> vs. <code>==</code> und Familienstammbaum-Klassen.</div>
|
||
</div>
|
||
<div class="roadmap-footer">Kapitel 07 öffnen →</div>
|
||
</a>
|
||
|
||
<!-- Vorschau Kapitel 8 -->
|
||
<div class="roadmap-card" style="opacity: 0.85;">
|
||
<div>
|
||
<span class="roadmap-number">Kapitel 08 • In Vorbereitung</span>
|
||
<div class="roadmap-title">➕ Operator Overloading & Dunder</div>
|
||
<div class="roadmap-desc">Eigene Klassen rechen- und vergleichbar machen mit <code>__add__</code>, <code>__eq__</code>, <code>__lt__</code> für 2D-Vektoren & Kartenspiele.</div>
|
||
</div>
|
||
<div class="roadmap-footer" style="color: var(--text-muted);">Schulabgleich 28.0</div>
|
||
</div>
|
||
|
||
<!-- Vorschau Kapitel 9 -->
|
||
<div class="roadmap-card" style="opacity: 0.85; border-left: 4px solid var(--primary);">
|
||
<div>
|
||
<span class="roadmap-number" style="background: var(--primary-light); color: var(--primary);">Kapitel 09 • Neu</span>
|
||
<div class="roadmap-title">🧪 Eigene Unit Tests schreiben (TDD)</div>
|
||
<div class="roadmap-desc">Schreibe eigene Testsuiten mit <code>unittest</code>, <code>self.assertEqual()</code>, <code>assertRaises()</code> und lerne Test-Driven Development.</div>
|
||
</div>
|
||
<div class="roadmap-footer" style="color: var(--text-muted);">Softwarequalität • TDD</div>
|
||
</div>
|
||
|
||
<!-- Vorschau Kapitel 10-13 -->
|
||
<div class="roadmap-card" style="opacity: 0.85;">
|
||
<div>
|
||
<span class="roadmap-number">Kapitel 10 - 13 • Geplant</span>
|
||
<div class="roadmap-title">🧬 Vererbung, Exceptions & JSON</div>
|
||
<div class="roadmap-desc">Vererbung & <code>super()</code> (10), Polymorphie (11), Eigene Fehlerklassen (12) und Savegames mit JSON/CSV sichern (13).</div>
|
||
</div>
|
||
<div class="roadmap-footer" style="color: var(--text-muted);">Ausführlicher Plan in LEHRPLAN.md</div>
|
||
</div>
|
||
|
||
</div>
|
||
</section>
|
||
|
||
<!-- AUSFÜHRLICHE TEST-ANLEITUNG -->
|
||
<section class="card" style="margin-top: 35px; border-left: 5px solid var(--primary);">
|
||
<h2>🧪 Wie benutze ich die Tests? (Komplette Test-Anleitung)</h2>
|
||
|
||
<p>
|
||
In der professionellen Softwareentwicklung schreibt man zu jedem Code automatische <strong>Unit Tests</strong>.
|
||
Das Geniale daran: <strong>Du musst nie raten, ob deine Lösung stimmt!</strong> Das Testskript überprüft deine Funktionen in Sekundenbruchteilen mit vielen verschiedenen Testfällen.
|
||
</p>
|
||
|
||
<h3>1. Einen Test für ein einzelnes Kapitel ausführen</h3>
|
||
<p>Öffne das Terminal in VS Code mit <kbd>Strg</kbd> + <kbd>`</kbd> (Mac: <kbd>Cmd</kbd> + <kbd>`</kbd>). Wechsle in den jeweiligen Kapitelordner und starte das Testskript:</p>
|
||
|
||
<div class="code-container">
|
||
<div class="code-header">
|
||
<span>Terminal (Beispiel für Kapitel 01)</span>
|
||
</div>
|
||
<pre><code>cd 01_einstieg_klassen
|
||
python3 test_aufgabe.py</code></pre>
|
||
</div>
|
||
|
||
<h3>2. Wie lese ich das Testergebnis?</h3>
|
||
|
||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin: 15px 0;">
|
||
|
||
<div style="background: var(--success-light); border: 1px solid var(--success); border-radius: var(--radius-sm); padding: 14px;">
|
||
<h4 style="color: var(--success); margin-bottom: 6px;">✅ Alles bestanden (OK)</h4>
|
||
<pre style="padding: 6px; font-size: 0.82rem; background: rgba(0,0,0,0.05); color: #064e3b; border-radius: 4px;"><code>Ran 4 tests in 0.002s
|
||
OK</code></pre>
|
||
<p style="font-size: 0.88rem; margin: 6px 0 0 0; color: #064e3b;">Perfekt! Alle Anforderungen sind erfüllt. Du bist bereit für das nächste Kapitel!</p>
|
||
</div>
|
||
|
||
<div style="background: var(--warning-light); border: 1px solid var(--warning); border-radius: var(--radius-sm); padding: 14px;">
|
||
<h4 style="color: var(--warning); margin-bottom: 6px;">❌ Falsches Ergebnis (FAIL)</h4>
|
||
<pre style="padding: 6px; font-size: 0.82rem; background: rgba(0,0,0,0.05); color: #78350f; border-radius: 4px;"><code>AssertionError: 25 != 40
|
||
berechne_endstand falsch</code></pre>
|
||
<p style="font-size: 0.88rem; margin: 6px 0 0 0; color: #78350f;">Dein Code stürzt nicht ab, aber liefert einen falschen Wert (z.B. falsche Rechenformel).</p>
|
||
</div>
|
||
|
||
<div style="background: var(--danger-light); border: 1px solid var(--danger); border-radius: var(--radius-sm); padding: 14px;">
|
||
<h4 style="color: var(--danger); margin-bottom: 6px;">💥 Absturz / Syntax (ERROR)</h4>
|
||
<pre style="padding: 6px; font-size: 0.82rem; background: rgba(0,0,0,0.05); color: #7f1d1d; border-radius: 4px;"><code>AttributeError: 'Fahrrad'
|
||
object has no attribute 'gang'</code></pre>
|
||
<p style="font-size: 0.88rem; margin: 6px 0 0 0; color: #7f1d1d;">Ein Attribut oder Methodenname fehlt oder ist falsch geschrieben (z.B. Tippfehler).</p>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<h3>3. Gesamten Kursfortschritt auf einen Klick prüfen</h3>
|
||
<p>Du möchtest wissen, wie viele Kapitel du schon gelöst hast? Führe im Hauptordner <code>Aufgaben-Python</code> einfach folgenden Befehl aus:</p>
|
||
|
||
<div class="code-container">
|
||
<div class="code-header">
|
||
<span>Terminal (Hauptordner)</span>
|
||
</div>
|
||
<pre><code>python3 test_all.py</code></pre>
|
||
</div>
|
||
|
||
<div class="box box-tipp">
|
||
<div class="box-title">💡 Die 3 goldenen Regeln beim Arbeiten mit Tests:</div>
|
||
<ol style="margin-left: 20px; margin-top: 6px;">
|
||
<li style="margin-bottom: 6px;"><strong>Immer <code>return</code> statt nur <code>print()</code>:</strong> Tests prüfen das, was eine Funktion mit <code>return</code> zurückliefert. Ein <code>print()</code> zeigt es zwar auf dem Bildschirm an, reicht dem Test aber nicht!</li>
|
||
<li style="margin-bottom: 6px;"><strong>Exakte Namen beachten:</strong> Wenn die Aufgabe <code>def mutter_setzen(self):</code> verlangt, darf die Methode nicht <code>def MutterSetzen</code> heißen (Python unterscheidet Groß- und Kleinschreibung).</li>
|
||
<li style="margin-bottom: 6px;"><strong>Fehlermeldungen von unten nach oben lesen:</strong> Ganz unten steht immer genau, was nicht gepasst hat!</li>
|
||
</ol>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- FAQ & Troubleshooting Card -->
|
||
<section class="card">
|
||
<h2>🩺 Häufige Fragen & Troubleshooting</h2>
|
||
|
||
<details>
|
||
<summary>❌ Fehlermeldung: <code>TypeError: ... takes 0 positional arguments but 1 was given</code></summary>
|
||
<div class="details-content">
|
||
<p><strong>Ursache:</strong> Du hast bei einer Methode in deiner Klasse das <code>self</code> im Methodenkopf vergessen!</p>
|
||
<p><strong>Lösung:</strong> Schreibe <code>def meine_methode(self):</code> statt <code>def meine_methode():</code>.</p>
|
||
</div>
|
||
</details>
|
||
|
||
<details>
|
||
<summary>❌ Fehlermeldung: <code>AttributeError: 'NoneType' object has no attribute '...'</code></summary>
|
||
<div class="details-content">
|
||
<p><strong>Ursache:</strong> Eine Funktion oder Methode hat nichts zurückgegeben (also <code>None</code>), und du versuchst, darauf zuzugreifen.</p>
|
||
<p><strong>Lösung:</strong> Prüfe, ob du am Ende der Methode das <code>return ...</code> vergessen hast!</p>
|
||
</div>
|
||
</details>
|
||
|
||
<details>
|
||
<summary>❌ Wie wechsle ich im Terminal zwischen den Ordnern hin und her?</summary>
|
||
<div class="details-content">
|
||
<p><strong>In einen Unterordner hinein:</strong> <code>cd 01_einstieg_klassen</code></p>
|
||
<p><strong>Einen Ordner nach oben zurück:</strong> <code>cd ..</code></p>
|
||
<p><strong>Inhalt des aktuellen Ordners auflisten:</strong> <code>ls</code> (oder <code>dir</code> auf Windows)</p>
|
||
</div>
|
||
</details>
|
||
</section>
|
||
|
||
</main>
|
||
|
||
</body>
|
||
</html>
|