Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
talit:oop_einfuehrung [2022-06-05 12:37] – [1. OOP Basics] scatalit: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 {{ :talit:2022_talit_oop_python_i.pdf|Slides}} für eine detaillierte Einführung in die **objektorientierte Programmierung (OOP)**. Hier im Wiki sind einfach die allerwichtigsten Grundlagen angegeben.
  
 In der objektorientierten Programmierung schreibt man **Klassen**, von welcher man dann **Objekte** instanziiert.  In der objektorientierten Programmierung schreibt man **Klassen**, von welcher man dann **Objekte** instanziiert. 
Zeile 16: Zeile 16:
 <code python> <code python>
 class Person: class Person:
-    # CONSTRUCTOR, gets called whenever a new object of the class is instanciated. 
-    # Use to pass values to the attributes 
     def __init__(self,_name,_address,_birthday,_type,_position,_klasse):     def __init__(self,_name,_address,_birthday,_type,_position,_klasse):
-        # 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 'class' bc is keyword         self.klasse = _klasse # can't use 'class' bc is keyword
  
-    # CLASS METHODS 
     def get_info(self):     def get_info(self):
 +        # TODO: return different string for teachers and students
         return f"Name: {self.name}, Adresse: {self.address}, Geburtstag: {self.birthday}, Typ: {self.type}"         return f"Name: {self.name}, Adresse: {self.address}, Geburtstag: {self.birthday}, Typ: {self.type}"
  
     def get_age(self):     def get_age(self):
-        # TODO: determine age using datetime module +        # TODO: determine and return age using datetime module (compare date today with birthdate) 
-        return None+        raise NotImplementedError()
  
     def change_klasse(self,x=1):     def change_klasse(self,x=1):
-        # 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 
-        return None+        raise NotImplementedError()
 </code> </code>
 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
 {{ :talit:inthatcase.jpg?400 |}} {{ :talit:inthatcase.jpg?400 |}}
 +
 +==== 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:innen, Lehrpersonen, siehe ISY oder nachfragen)
 +   1. Füge weitere **Attribute** hinzu: Telefonnummer & Mail-Adresse
 +   1. Erweitere `get_info()`: Andere Info für LP und STU:
 +     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,_name,_address,_birthday,_phone,_mail,_type,_position,_klasse):
 +        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 'class' bc is keyword
 +
 +    def get_info(self):
 +        str_all = f"Name: {self.name}, Adresse: {self.address}, Geburtstag: {self.birthday}, Phone: {self.phone}, Mail: {self.mail}, Typ: {self.type} "
 +        if self.type == "LP":
 +            return  str_all + f"Position: {self.position}"
 +        else:
 +            return str_all + f"Klasse: {self.klasse}"
 +
 +    def get_age(self):
 +        birthdate = datetime.strptime(self.birthday,"%d.%m.%Y")
 +        now = datetime.now()
 +        diff = relativedelta.relativedelta(now,birthdate)
 +        return diff.years
 +
 +    def change_klasse(self,x=1):
 +        yr = int(self.klasse[0]) + x
 +        self.klasse = str(yr) + self.klasse[1::]
 +
 +# instantiate objects, store in list
 +persons = [
 +    Person("Bert Schreiner", "Hoehenweg 8, 8590 Romanshorn TG", "07.12.1969","071 847 41 23","scb@ksr.ch","LP","HL",None),
 +    Person("Monika Hohler", "Seeblickstrasse 17, 9306 Freidorf", "24.05.1990","071 369 54 11", "hom@ksr.ch", "LP","LB1",None),
 +    Person("Verena Keller", "Saentisstrasse 22, 8580 Amriswil", "03.02.2007","071 345 67 78", "verkelle@ksr.ch", "STU",None,"1Fd"),
 +    Person("Heiri Meier", "Kreisstrasse 3, 9322 Egnach", "11.09.2005", "071 499 85 31","heiri@rasenmeier.ch", "STU",None,"3Mfz")
 +]
 +
 +sca = Person("Andreas Schärer","Weinfelden","03.09.1987","123","sca@ksr.ch","LP","HL",None)
 +print(sca.get_age())
 +
 +verkelle = Person("Verena Keller", "Saentisstrasse 22, 8580 Amriswil", "03.02.2007","071 345 67 78", "verkelle@ksr.ch", "STU",None,"1Fd")
 +heimeier = Person("Heiri Meier", "Kreisstrasse 3, 9322 Egnach", "11.09.2005", "071 499 85 31","heiri@rasenmeier.ch", "STU",None,"3Mfz")
 +verkelle.change_klasse() # Verena
 +heimeier.change_klasse(-1) # Heiri has to repeat a year
 +print(verkelle.klasse)
 +print(heimeier.klasse)
 +</code>
 +++++
 +</nodisp>
 +
 +==== 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.
 +
  
  • talit/oop_einfuehrung.1654432631.txt.gz
  • Zuletzt geändert: 2022-06-05 12:37
  • von sca