Aufgaben-Python/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html

397 lines
23 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>
<link rel="icon" type="image/svg+xml" href="../../assets/favicon.svg">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kapitel 03: Methoden und Verhalten</title>
<link rel="stylesheet" href="../../assets/style.css">
</head>
<body>
<div class="app-layout">
<aside class="app-sidebar">
<div class="sidebar-header">
<a href="../../index.html" class="sidebar-brand-link">
<div class="sidebar-logo">🐍</div>
<div>
<div class="sidebar-title">Python Portal</div>
<div class="sidebar-subtitle">Lernplattform</div>
</div>
</a>
</div>
<div class="sidebar-quick-nav">
<a href="../../index.html" class="sidebar-link">🏠 Startseite</a>
<a href="../../index.html#tutorial" class="sidebar-link">📖 Tutorial &amp; Workflow</a>
<a href="../../index.html#zertifikate" class="sidebar-link">🏆 Zertifikate</a>
</div>
<div class="sidebar-nav">
<div class="sidebar-group">
<div class="sidebar-group-title">
<span>🌱 1. Grundlagen</span>
<span style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 99px; font-size: 0.7rem;">G01–G10</span>
</div>
<div style="display: flex; flex-direction: column; gap: 2px;">
<a href="../../lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧮</span>
<span class="sidebar-link-text">G01. Taschenrechner</span>
</a>
<a href="../../lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">📦</span>
<span class="sidebar-link-text">G02. Variablen & Typen</span>
</a>
<a href="../../lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html" class="sidebar-link">
<span class="sidebar-link-icon">💬</span>
<span class="sidebar-link-text">G03. Ein- & Ausgabe</span>
</a>
<a href="../../lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🚦</span>
<span class="sidebar-link-text">G04. Bedingungen (if)</span>
</a>
<a href="../../lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎡</span>
<span class="sidebar-link-text">G05. Schleifen (for/while)</span>
</a>
<a href="../../lehrpfad_1_grundlagen/06_funktionen_und_module/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🪄</span>
<span class="sidebar-link-text">G06. Funktionen & Module</span>
</a>
<a href="../../lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">📋</span>
<span class="sidebar-link-text">G07. Listen & Sequenzen</span>
</a>
<a href="../../lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🔤</span>
<span class="sidebar-link-text">G08. String-Methoden</span>
</a>
<a href="../../lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🗃️</span>
<span class="sidebar-link-text">G09. Dicts & Sets</span>
</a>
<a href="../../lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🚀</span>
<span class="sidebar-link-text">G10. Comprehensions</span>
</a>
</div>
</div>
<div class="sidebar-group">
<div class="sidebar-group-title">
<span>🏗️ 2. OOP Einstieg</span>
<span style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 99px; font-size: 0.7rem;">00–06</span>
</div>
<div style="display: flex; flex-direction: column; gap: 2px;">
<a href="../../lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🔍</span>
<span class="sidebar-link-text">00. Fehlersuche & Debug</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🏗️</span>
<span class="sidebar-link-text">01. Einstieg in Klassen</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/02_init_und_self/index.html" class="sidebar-link">
<span class="sidebar-link-icon">⚙️</span>
<span class="sidebar-link-text">02. Konstruktor & self</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html" class="sidebar-link active">
<span class="sidebar-link-icon">🏎️</span>
<span class="sidebar-link-text">03. Methoden & Verhalten</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧾</span>
<span class="sidebar-link-text">04. __str__ Darstellung</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html" class="sidebar-link">
<span class="sidebar-link-icon">💻</span>
<span class="sidebar-link-text">04b. VS Code Setup</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🌿</span>
<span class="sidebar-link-text">04c. Git-Versionskontrolle</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎵</span>
<span class="sidebar-link-text">05. Objekte kombinieren</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🥚</span>
<span class="sidebar-link-text">06. Projekt: Tamagotchi</span>
</a>
</div>
</div>
<div class="sidebar-group">
<div class="sidebar-group-title">
<span>🚀 3. Fortgeschritten</span>
<span style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 99px; font-size: 0.7rem;">07–16</span>
</div>
<div style="display: flex; flex-direction: column; gap: 2px;">
<a href="../../lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧠</span>
<span class="sidebar-link-text">07. Referenzen & Speicher</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html" class="sidebar-link">
<span class="sidebar-link-icon">➕</span>
<span class="sidebar-link-text">08. Operator Overloading</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧪</span>
<span class="sidebar-link-text">09. Unit Tests & TDD</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧬</span>
<span class="sidebar-link-text">10. Vererbung & super()</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎭</span>
<span class="sidebar-link-text">11. Polymorphie</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🛡️</span>
<span class="sidebar-link-text">12. Exceptions & Fehler</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html" class="sidebar-link">
<span class="sidebar-link-icon">💾</span>
<span class="sidebar-link-text">13. Persistenz (JSON/CSV)</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🖥️</span>
<span class="sidebar-link-text">14. Desktop-GUIs (Tkinter)</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎒</span>
<span class="sidebar-link-text">15. Container & *args</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🏆</span>
<span class="sidebar-link-text">16. Master-Abschlussprojekt</span>
</a>
</div>
</div>
</div>
<div class="sidebar-footer">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="font-size: 0.85rem; font-weight: 700; color: white;" id="sidebar-level-text">⭐ Level 1</div>
<div style="font-size: 0.82rem; font-weight: 700; color: #38bdf8;" id="sidebar-xp-text">0 XP</div>
</div>
</div>
</aside>
<div class="app-main">
<header>
<div class="header-container">
<nav class="nav-links">
<a href="../../index.html">🏠 Zur Kursübersicht</a>
<span>&rsaquo;</span>
<a href="../02_init_und_self/index.html">Kapitel 02</a>
<span>&rsaquo;</span>
<span style="color: white; font-weight: 600;">Kapitel 03</span>
</nav>
<div class="header-badge">Kapitel 03</div>
<h1>Methoden &amp; Verhalten: Wenn Objekte lebendig werden ⚔️</h1>
<p>Lass Objekte aktiv handeln und miteinander interagieren anhand eines vollständigen Rennspiel- &amp; Duell-Beispiels.</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="../../workspace.html?course=python&track=lehrpfad_2_oop_einstieg&chapter=03_methoden_und_verhalten" class="btn" style="background: #10b981; color: #fff; font-weight: 700;">💻 In Web-IDE öffnen &rarr;</a>
<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. Was sind Methoden -->
<section class="card">
<h2>1. Was sind Methoden?</h2>
<p>
Bisher haben unsere Klassen vor allem Daten gespeichert. Aber in der echten Programmierung haben Objekte auch <strong>Verhalten</strong> (sie können etwas <em>tun</em>). Funktionen, die innerhalb einer Klasse stehen, nennt man <strong>Methoden</strong>.
</p>
<div class="box box-tipp">
<div class="box-title">💡 Der Unterschied zwischen Funktion und Methode:</div>
<ul>
<li>Eine <strong>Funktion</strong> steht frei im Code: <code>berechne_summe(a, b)</code></li>
<li>Eine <strong>Methode</strong> gehört zu einem Objekt und wird mit Punkt aufgerufen: <code>mein_held.angreifen(gegner)</code></li>
</ul>
</div>
</section>
<!-- 2. Vollständiges Beispiel: Rennauto -->
<section class="card">
<h2>2. 🏎️ Vollständiges Beispiel: Die Rennauto-Klasse</h2>
<p>Hier siehst du eine vollständige Klasse mit Konstruktor, mehreren Methoden, Wertebegrenzung (Tankinhalt) und einer Renn-Simulation:</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: rennauto.py)</span>
</div>
<pre><span class="kw">class</span> <span class="fn">Rennauto</span>:
<span class="kw">def</span> <span class="fn">__init__</span>(<span class="var">self</span>, <span class="var">fahrer</span>, <span class="var">speed</span>, <span class="var">tank</span>=<span class="num">50</span>):
<span class="var">self</span>.<span class="attr">fahrer</span> = <span class="var">fahrer</span>
<span class="var">self</span>.<span class="attr">speed</span> = <span class="var">speed</span> <span class="cm"># z.B. 220 km/h</span>
<span class="var">self</span>.<span class="attr">tank</span> = <span class="var">tank</span> <span class="cm"># Aktueller Tank in Litern</span>
<span class="var">self</span>.<span class="attr">max_tank</span> = <span class="var">tank</span> <span class="cm"># Maximales Tankvolumen</span>
<span class="var">self</span>.<span class="attr">gefahrene_km</span> = <span class="num">0</span>
<span class="cm"># Methode 1: Fahren (verbraucht Benzin)</span>
<span class="kw">def</span> <span class="fn">fahren</span>(<span class="var">self</span>, <span class="var">km</span>):
<span class="var">verbrauch</span> = <span class="var">km</span> * <span class="num">0.2</span> <span class="cm"># 0.2 Liter pro km</span>
<span class="kw">if</span> <span class="var">self</span>.<span class="attr">tank</span> >= <span class="var">verbrauch</span>:
<span class="var">self</span>.<span class="attr">tank</span> -= <span class="var">verbrauch</span>
<span class="var">self</span>.<span class="attr">gefahrene_km</span> += <span class="var">km</span>
<span class="kw">return</span> <span class="str">f"{self.fahrer} fährt {km} km (Tank: {self.tank:.1f}L übrig)"</span>
<span class="kw">else</span>:
<span class="kw">return</span> <span class="str">f"{self.fahrer} hat nicht genug Sprit für {km} km!"</span>
<span class="cm"># Methode 2: Tanken (nicht über max_tank)</span>
<span class="kw">def</span> <span class="fn">tanken</span>(<span class="var">self</span>, <span class="var">liter</span>):
<span class="var">freier_platz</span> = <span class="var">self</span>.<span class="attr">max_tank</span> - <span class="var">self</span>.<span class="attr">tank</span>
<span class="var">getankt</span> = <span class="fn">min</span>(<span class="var">freier_platz</span>, <span class="var">liter</span>)
<span class="var">self</span>.<span class="attr">tank</span> += <span class="var">getankt</span>
<span class="kw">return</span> <span class="str">f"{self.fahrer} tankt {getankt:.1f} Liter nach (Tank: {self.tank:.1f}/{self.max_tank}L)"</span>
<span class="cm"># Methode 3: Interaktion mit einem anderen Auto</span>
<span class="kw">def</span> <span class="fn">duell_gegen</span>(<span class="var">self</span>, <span class="var">gegner_auto</span>):
<span class="kw">if</span> <span class="var">self</span>.<span class="attr">speed</span> > <span class="var">gegner_auto</span>.<span class="attr">speed</span>:
<span class="kw">return</span> <span class="str">f"{self.fahrer} überholt {gegner_auto.fahrer} mit Leichtigkeit!"</span>
<span class="kw">elif</span> <span class="var">self</span>.<span class="attr">speed</span> &lt; <span class="var">gegner_auto</span>.<span class="attr">speed</span>:
<span class="kw">return</span> <span class="str">f"{gegner_auto.fahrer} zieht an {self.fahrer} vorbei!"</span>
<span class="kw">else</span>:
<span class="kw">return</span> <span class="str">f"{self.fahrer} und {gegner_auto.fahrer} sind genau gleich schnell!"</span>
<span class="cm"># Ausprobieren:</span>
<span class="kw">if</span> <span class="var">__name__</span> == <span class="str">"__main__"</span>:
<span class="var">auto1</span> = <span class="fn">Rennauto</span>(<span class="str">"Max"</span>, <span class="var">speed</span>=<span class="num">240</span>, <span class="var">tank</span>=<span class="num">40</span>)
<span class="var">auto2</span> = <span class="fn">Rennauto</span>(<span class="str">"Lewis"</span>, <span class="var">speed</span>=<span class="num">235</span>, <span class="var">tank</span>=<span class="num">50</span>)
<span class="fn">print</span>(<span class="var">auto1</span>.<span class="fn">fahren</span>(<span class="num">100</span>)) <span class="cm"># Verbraucht 20 Liter -> 20L übrig</span>
<span class="fn">print</span>(<span class="var">auto1</span>.<span class="fn">duell_gegen</span>(<span class="var">auto2</span>)) <span class="cm"># Max ist schneller als Lewis!</span>
<span class="fn">print</span>(<span class="var">auto1</span>.<span class="fn">tanken</span>(<span class="num">30</span>)) <span class="cm"># Tankt bis max 40L auf</span></pre>
</div>
</section>
<!-- 3. Interaktion zwischen Objekten -->
<section class="card">
<h2>3. 🤝 Interaktion: Ein Objekt übergibt sich an ein anderes</h2>
<p>
In der Methode <code>angreifen(self, gegner)</code> übergibst du das gegnerische Held-Objekt als Parameter:
</p>
<div class="box box-analogie">
<div class="box-title">⚔️ Wie das Helden-Duell funktioniert:</div>
<code>ritter.angreifen(drache)</code>
<br><br>
1. <code>self</code> ist der Ritter (mit <code>self.angriffskraft</code>).<br>
2. <code>gegner</code> ist der Drache.<br>
3. Der Ritter ruft: <code>gegner.schaden_erleiden(self.angriffskraft)</code> auf!<br>
4. Der Drache verliert Leben und prüft, ob er noch lebt.
</div>
</section>
<!-- 4. Aufgaben Card -->
<section class="card">
<h2>4. 🎯 Deine Aufgaben in <code><a href="aufgabe.py" style="color: inherit; text-decoration: underline;">aufgabe.py</a></code></h2>
<ul class="task-list">
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t3_1">
<label for="t3_1" class="task-label">
<strong>TODO 1:</strong> <code>__init__(self, name, leben=100, angriffskraft=15)</code> mit <code>max_leben = leben</code> und <code>ist_am_leben = True</code>.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t3_2">
<label for="t3_2" class="task-label">
<strong>TODO 2:</strong> <code>schaden_erleiden(self, schaden)</code>: Wenn <code>leben &lt;= 0</code> wird -> <code>leben = 0</code> und <code>ist_am_leben = False</code>.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t3_3">
<label for="t3_3" class="task-label">
<strong>TODO 3:</strong> <code>heilen(self, heilung)</code>: Erhöht Leben maximal bis <code>max_leben</code> (nur wenn noch am Leben).
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t3_4">
<label for="t3_4" class="task-label">
<strong>TODO 4:</strong> <code>angreifen(self, gegner)</code>: Ruft <code>gegner.schaden_erleiden(self.angriffskraft)</code> auf (nur wenn beide leben).
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t3_5">
<label for="t3_5" class="task-label">
<strong>TODO 5:</strong> <code>status_text(self)</code>: Gibt formatierten Status zurück.
</label>
</li>
</ul>
<h3>💡 Lösungshinweise (Aufklappen bei Bedarf)</h3>
<details>
<summary>🔍 Tipp zu TODO 4 (Angriff)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="kw">def</span> <span class="fn">angreifen</span>(<span class="var">self</span>, <span class="var">gegner</span>):
<span class="kw">if</span> <span class="var">self</span>.<span class="attr">ist_am_leben</span> <span class="kw">and</span> <span class="var">gegner</span>.<span class="attr">ist_am_leben</span>:
<span class="var">gegner</span>.<span class="fn">schaden_erleiden</span>(<span class="var">self</span>.<span class="attr">angriffskraft</span>)
<span class="kw">return</span> <span class="kw">True</span>
<span class="kw">return</span> <span class="kw">False</span></pre>
</div>
</div>
</details>
</section>
<!-- 5. Testen & Navigation -->
<section class="card">
<h2>5. 🧪 Lösung überprüfen</h2>
<p>Führe im Terminal im Ordner <code>03_methoden_und_verhalten</code> folgenden Befehl 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="../02_init_und_self/index.html" class="btn btn-secondary">&larr; Zurück zu Kapitel 02</a>
<a href="../04_str_und_darstellung/index.html" class="btn">Weiter zu Kapitel 04 &rarr;</a>
</div>
</section>
</main>
</div>
</div>
<button type="button" class="sidebar-mobile-toggle"><span>☰ Menü</span></button>
<div class="sidebar-overlay"></div>
<!-- Scripts -->
<script src="../../assets/gamification_data.js"></script>
<script src="../../assets/gamification.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/certificate.js"></script>
<script src="../../assets/parsons.js"></script>
<script src="../../assets/runner.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>