Objektorientierung in Python


Object Oriented Programming is everywhere!

h:400


🎯 Lernziele

Nach dieser Einheit sind Sie in der Lage dazu * die fünf Prinzipien der Objektorientierung nennen * Beispiele hierfür zu geben * in Python umzusetzen


Fünf Prinzipien der Objektorientierung

  • Abstraktion
  • Kapselung (Data hiding)
  • Wiederverwendung
  • Beziehungen
  • Polymorphismus

Abstraktion

Objekte nur so detailliert beschreiben, wie nötig:

class TestPerson:
    def __init__(self, dateofbirth, haircolor):
        self.dateofbirth = dateofbirth
        self.haircolor = haircolor #  Für Leistungstest überflüssig

Kapselung (Data hiding)

Zugriff auf Methoden und Attribute bewusst setzen (z.B. getter, setter)

from datetime import datetime

class Person:
    def __init__(self, dateofbirth):
        self.__dateofbirth = dateofbirth
    def get_age(self):
        age =  datetime.today().year- self.__dateofbirth.year
        return age
p = Person(datetime.strptime("01/01/2000", '%d/%m/%Y'))
p.get_age()

Wiederverwendung

Klassen so anlegen, dass sie in verschiedenen Kontexten eingesetzt werden können

class TimeSeriesAnalyzer:
    def __init__(self, time_series, unit):
        self.values = values
        self.unit = unit

    def calc_mean(self):
        print(str(sum(self.values)/len(self.values)) + " "+  self.unit)


tsa_ekg = TimeSeriesAnalyzer([0.1, 0.1, 0.12, 0.14, 0.1, 1.1], 'mV')
tsa_ekg.calc_mean()

tsa_power = TimeSeriesAnalyzer([80, 90, 100], 'W')
tsa_power.calc_mean()

Beziehungen

Vererbung nutzen, um Spezialfälle abzubilden

class HeartRateSeriesAnalyzer(TimeSeriesAnalyzer):

    # Konstruktor entfällt, da er von TimeSeriesAnalyzer geerbt wird

    def calc_hrv(self):
          #<###>
        print("HRV is xx ms!")


tsa_hr2 = TimeSeriesAnalyzer([0.1, 0.1, 0.12, 0.14, 0.1, 1.1], 'mV')
tsa_hr2.calc_hrv()

h:120


Polymorphismus

Gleichnamige Methoden können in verschiedenen Klassen anders agieren

class HeartRateSeriesAnalyzer(TimeSeriesAnalyzer):
    def check_fail(self):
        if outage == True:
            return True
        else:
            return False

class PowerTimeSeriesAnalyzer(TimeSeries):
    def check_fail(self):
        if (too_high or too_low) == True:
            return True
        else:
            return False
<...>
for series in [tsa_hr2, tsa_power]:
    print(series.check_fail())

✍️ Freiwillige Übungs-Aufgabe

2.2 Arbeit mit Klassen und Instanzen (Objekten)

2.3 Vererbung


🏆 Sakai-Aufgabe 6.2: Objektorientierung

  • Nutzen Sie das bestehende Repository und den Branch mit ihrem Namen
  • Committen Sie die stabile Lösungen und comitten Sie wieder mit der Commit-Message Aufgabe62,
  • Passen Sie den Code der Sakai-Aufgabe 6.1 so an, dass die Super-Klasse Person existiert von denen die Subklassen Subject und Supervisor erben.
  • Hierbei soll jede Klasse nur die nötigsten Attribute und Methoden enthalten.
  • Um Berechnung des maximalen Pules präziser zu machen, soll von nun anstelle des Alters an das Geburtsdatum als verstecktes (private) Attribute gespeichert werden und die Berechnung darauf basieren.
  • Geben Sie wieder den Link zum Repository in Sakai ab