Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| talit:oop_einfuehrung [2022-06-05 12:37] – [1. OOP Basics] sca | talit:oop_einfuehrung [2023-05-03 08:33] (aktuell) – [Auftrag 2: OOP im Game] sca | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== OOP Einführung ====== | ====== OOP Einführung ====== | ||
| - | ===== - OOP Basics | + | ===== - Klassen und Objekte |
| - | Studiere die Slides für eine detaillierte Einführung in die **objektorientierte Programmierung (OOP)**. Hier im Wiki sind einfach die allerwichtigsten Grundlagen angegeben. | + | Studiere die {{ : |
| In der objektorientierten Programmierung schreibt man **Klassen**, | In der objektorientierten Programmierung schreibt man **Klassen**, | ||
| Zeile 16: | Zeile 16: | ||
| <code python> | <code python> | ||
| class Person: | class Person: | ||
| - | # CONSTRUCTOR, | ||
| - | # Use to pass values to the attributes | ||
| def __init__(self, | def __init__(self, | ||
| - | # ATTRIBUTES of the class | ||
| self.name = _name | self.name = _name | ||
| self.address = _address | self.address = _address | ||
| Zeile 27: | Zeile 24: | ||
| self.klasse = _klasse # can't use ' | self.klasse = _klasse # can't use ' | ||
| - | # CLASS METHODS | ||
| def get_info(self): | def get_info(self): | ||
| + | # TODO: return different string for teachers and students | ||
| return f" | return f" | ||
| def get_age(self): | def get_age(self): | ||
| - | # TODO: determine age using datetime module | + | # TODO: determine |
| - | | + | |
| def change_klasse(self, | def change_klasse(self, | ||
| - | # TODO: change class by x, default value is x=1 | + | # TODO: change class by x, default value is x=1, example: for x=-1 from 3Mfz -> 2Mfz |
| - | | + | |
| </ | </ | ||
| Beachte dabei das Keyword **self.** Dieses repräsentiert das jeweilige Objekt. Beachte auch, dass es Klassenmethoden als erstes Argument übergeben werden muss. | Beachte dabei das Keyword **self.** Dieses repräsentiert das jeweilige Objekt. Beachte auch, dass es Klassenmethoden als erstes Argument übergeben werden muss. | ||
| Zeile 68: | Zeile 65: | ||
| * Klassennamen im UpperCamelCase | * Klassennamen im UpperCamelCase | ||
| {{ : | {{ : | ||
| + | |||
| + | ==== Auftrag 1: Klasse Person ==== | ||
| + | |||
| + | 1. Implementiere selbst die **Klasse Person**. Kein Copy-Paste, so viel wie geht aus Erinnerung anstelle Abschreiben | ||
| + | 1. Instanziiere selbst mind. vier **Objekte** der Klasse von echten Personen (du selbst, Kolleg: | ||
| + | 1. Füge weitere **Attribute** hinzu: Telefonnummer & Mail-Adresse | ||
| + | 1. Erweitere `get_info()`: | ||
| + | 1. für LP: "Name: Bert Schreiner, Adresse: … , … , … , Typ: LP, Position: HL" | ||
| + | 1. für STU: "Name: Verena Keller, Adresse: … , … , … , Typ: STU, Klasse: 1Fd" | ||
| + | 1. Zeige auch neue Attribute darin an. | ||
| + | 1. Implementiere Klassenmethode `increase_klasse()`. Gebe Fehlermeldung aus, falls für Lehrperson aufgerufen wird. | ||
| + | 1. Implementiere Klassenmethode `get_age()`. Tipp: Verwende datetime- und dateutil-Module | ||
| + | |||
| + | <nodisp 2> | ||
| + | ++++Lösung| | ||
| + | <code python> | ||
| + | from datetime import datetime | ||
| + | from dateutil import relativedelta | ||
| + | |||
| + | class Person: | ||
| + | def __init__(self, | ||
| + | self.name = _name | ||
| + | self.address = _address | ||
| + | self.birthday = _birthday | ||
| + | self.phone = _phone | ||
| + | self.mail = _mail | ||
| + | self.type = _type | ||
| + | self.position = _position | ||
| + | self.klasse = _klasse # can't use ' | ||
| + | |||
| + | def get_info(self): | ||
| + | str_all = f" | ||
| + | if self.type == " | ||
| + | return | ||
| + | else: | ||
| + | return str_all + f" | ||
| + | |||
| + | def get_age(self): | ||
| + | birthdate = datetime.strptime(self.birthday," | ||
| + | now = datetime.now() | ||
| + | diff = relativedelta.relativedelta(now, | ||
| + | return diff.years | ||
| + | |||
| + | def change_klasse(self, | ||
| + | yr = int(self.klasse[0]) + x | ||
| + | self.klasse = str(yr) + self.klasse[1:: | ||
| + | |||
| + | # instantiate objects, store in list | ||
| + | persons = [ | ||
| + | Person(" | ||
| + | Person(" | ||
| + | Person(" | ||
| + | Person(" | ||
| + | ] | ||
| + | |||
| + | sca = Person(" | ||
| + | print(sca.get_age()) | ||
| + | |||
| + | verkelle = Person(" | ||
| + | heimeier = Person(" | ||
| + | verkelle.change_klasse() # Verena | ||
| + | heimeier.change_klasse(-1) # Heiri has to repeat a year | ||
| + | print(verkelle.klasse) | ||
| + | print(heimeier.klasse) | ||
| + | </ | ||
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | ==== Auftrag 2: OOP im Game ==== | ||
| + | |||
| + | 1. Überlege dir mit einer Kolleg:in und mache Notizen: | ||
| + | 1. Wie könnte man OOP im Game von früher sinnvoll einsetzen? | ||
| + | 1. Welche Klasse(n) & Objekte braucht es? | ||
| + | 1. Welche Attribute und Methoden haben diese? | ||
| + | 1. Bespreche mit der Lehrperson | ||
| + | 1. Setze dies dann in der nächsten Aufgabe um. | ||
| + | |||