Vorlesung Skriptsprachen Duale Hochschule Stuttgart Sommersemester 2017 Dipl.-Ing. (FH) Volker Schepper Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 1 Objektorientiertes Programmieren • Sollen komplexe Systeme Programmiert werden, gibt es verschiedene Ansätze. Durch die Objektorientierte Programmierweise werden reale Objekte zu Objekte in dem Programm abgebildet. • Dadurch sollen komplexe Systeme beherrschbarer, fehlerfreie und Programmteile besser wiederverwendbarer sein. • Folgende drei Grundelemente existieren bei einer objektorientierter Software: • • • Vererbung Polymorphie Datenkapselung Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 2 Programmierparadigma • Programmierparadigma • Beschreibt die grundlegende Verfahren und Prinzipien zur Programmierung und damit zur Lösung der Aufgaben. • Imperative Programmierung • Die Abarbeitung der Befehle wird der Reihe nach abgearbeitet. GOTO wird für die Verzweigung verwendet. Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 3 Programmierparadigma • Strukturierte Programmierung • Einführung der Kontrollstrukturen. Z.B. in Python werden bedingte Sprünge eingerückt. • Prozedurale Programmierung • Durch Funktionen (Unterprogramme) wird das Programm in überschaubare Teile zerlegt. (Nicht zu verwechseln mit der Funktionalen Programmierung.) • Objektorientierte Programmierung • Die Reelle Wirklichkeit soll nach Möglichkeit 1:1 zu Objekten interpretiert werden. Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 4 Programmierparadigma - Deklarative • Deklarative Programmierung – Die Deklarative Programmierung ist Gegenentwurf zu der Imperative Programmierung. Hierbei liegt der Fokus auf die eigentliche Lösung des Problems und nicht auf die Beschreibung des Lösungsweges. Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 5 Objektorientiertes Programmieren Vererbung Ein abstraktes Objekt (Grundspezifikation eines Objektes) wird als Norm vorgeben. Andere Objekte lassen sich der Spezifikation des abstrakten Objektes ableiten. Das bedeute das spezifische Objekt erbt Normen von dem abstrakten Objekt. Polymorphie Bei der Umsetzung der Software soll darauf geachtet werden, dass es dem Programmierer erlauben bestimmte Elemente einfach auszutauschen. Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 6 Objektorientiertes Programmieren Datenkapselung Die Objekte können selbst dafür sorgen, dass die Daten konsistent bleiben. Der Zugriff auf Daten ist nur über einen bestimmten Mechanismus möglich. Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 7 Objektorientierung - Beispiel • Modellierung eines Autos als Objekt • • • • es hat gewisse Eigenschaften es besitzt gewisse Methoden Kommunikation mit dem Auto durch Methodenaufrufe es ist aus anderen Objekten zusammengesetzt Eigenschaften: • Marke • Farbe • Leistung • Baujahr • … Teilobjekte: • Motor • Reifen • Fenster • … Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper Methoden: • Anlassen • Beschleunigen • Bremsen • … 05.04.2017 8 Objektorientiertes Programmieren Zur einfacheren Visualisierung von Klassen werden grafische Symbole der Unified Modeling Language (UML) verwendet. Eine Klasse wird durch ein Rechteck dargestellt, welches in drei Felder unterteilt ist. Name der Klasse Fahrzeug Marke Farbe Baujahr Anlassen Die Liste der Attribute. Werden Klassenattribute verwendet, werden diese unterstrichen. Liste der Beschleunigen Methoden Bremsen (Operationsliste) Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 9 Klasse Eine Klasse wird einen Kopf und einen Körper definiert. Kopf Eingeleitet mit dem Schlüsselwort class und dem anschließenden Namen der Klasse sowie optionalen Oberklassen gefolgt von einem Doppelpunkt wird ein Klassen-Kopf beschrieben. Körper Im Körper der Klasse werden die Attribute und gegebenenfalls die Klassenmethoden definiert. class fahrzeug: def obj_print(self): print("Methode von der Klasse Fahrzeug wurde aufgerufen") Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 10 Objekt Ein Objekt wird erzeugt, wenn die Klasse aufgerufen wird. auto = fahrzeug() Bei der Initialisierung des Objektes können Argumente übergeben werden, welche in der Konstruktormethode definiert sind. auto = fahrzeug() auto.obj_print() Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 11 Methoden Methoden sind wesentliche Bestandteile eines Objektes. Sie Werden innerhalb einer Klassendeklaration definiert. Der erste Parameter self bezeichnet immer die Instanz (aktuelles Objekt). Definition einer Methode: def methode (self, argument1, argument2, … ) Aufruf einer Methode: objekt.methode (argument1, argument2, … ) Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 12 Klasse Definition der Klasse fahrzeug, sowie anschließende Instanziierung des Objekts auto und der Aufruf der Methode obj_print. class fahrzeug: def obj_print(self): print("Methode von der Klasse Fahrzeug wurde aufgerufen") auto = fahrzeug() auto.obj_print() OOP_01.py >>> Methode von der Klasse Fahrzeug wurde aufgerufen >>> Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 13 Konstruktor class fahrzeug: Nach dem erzeugen des Objekts wird der Konstruktor aufgerufen. def __init__(self): self.__aussentemperatur = 20 def set_aussentemperatur(self, aussentemperatur): self.__aussentemperatur = aussentemperatur def get_aussentemperatur(self): print(self.__aussentemperatur) Der Konstruktor ist im Grunde eine gewöhnliche Methode. auto = fahrzeug() auto.get_aussentemperatur() OOP_02_Konstruktor.py >>> 20 >>> Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 14 Destruktor class fahrzeug: def __init__(self): self.__aussentemperatur = 20 Wird das Objekt gelöscht. Wir der Destruktor aufgerufen, falls dieser vorhanden ist. def __del__(self): print("Die Klasse fahrzeug wurde gelöscht") def set_aussentemperatur(self, aussentemperatur): self.__aussentemperatur = aussentemperatur def get_aussentemperatur(self): print(self.__aussentemperatur) auto = fahrzeug() del auto OOP_03_Destruktor.py >>> 20 Die Klasse fahrzeug wurde gelöscht >>> Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 15 Manipulation von Attribute class fahrzeug: def set_leistung(self, leistung): self.leistung = leistung def get_leistung(self): print(self.leistung) auto = fahrzeug() auto.set_leistung(20) auto.get_leistung() # Objektattribut wird über Methode verändert. auto.leistung = 50 # Direkter Zugriff auf das Objektattribut. auto.get_leistung() OOP_04_Attribute.py >>> 20 50 >>> Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 16 Manipulation von Attribute • Objektattribute sollten immer über Methoden gesetzt/verändert werden. Ansonsten gesteht die Gefahr, dass das Objekt in einem inkonsistenten Zustand gerät. • Lösung: Um Attribute vor öffentliche Zugriff zu schützen, wird vor dem Namen des Attributs zwei Unterstriche angeführt. • Beispiel: Besitzt ein Objekt z.B. ein Attribut für seine Temperatur, so kann die Temperatur niemals unter 273,15°C sein. Mit einer eigenen set-Methode könnte diese Grenze überwacht werden. Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 17 Manipulation von Attribute class fahrzeug: def set_aussentemperatur(self, aussentemperatur): self.__aussentemperatur = aussentemperatur Das Beispiel zeigt, dass geschützte Attribute nicht außerhalb der Klasse verändert werden können. def get_aussentemperatur(self): print(self.__aussentemperatur) auto = fahrzeug() auto.set_aussentemperatur(20) auto.get_aussentemperatur() auto.aussentemperatur = 50 auto.__aussentemperatur = 60 auto.get_aussentemperatur() OOP_05_Attribute.py Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper >>> 20 20 >>> 05.04.2017 18 Properties Um dennoch scheinbar außerhalb der Klasse auf Attribute zugreifen zu können, werden property() Funktionen verwendet. outdoor_temp = property(get_aussentemperatur, set_aussentemperatur) Zuerst muss die get-Funktion angeführt werden anschließend optional eine set-Funktion. Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 19 Properties class fahrzeug: def __init__(self, aussentemperatur = 18): self.__aussentemperatur = aussentemperatur def set_aussentemperatur(self, aussentemperatur): if aussentemperatur >= -273.15: self.__aussentemperatur = aussentemperatur else: self.__aussentemperatur = 12 def get_aussentemperatur(self): print(self.__aussentemperatur) return self.__aussentemperatur outdoor_temp = property(get_aussentemperatur, set_aussentemperatur) OOP_06_Properties.py Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 20 Properties auto = fahrzeug() auto.outdoor_temp = 34 print(auto.outdoor_temp) OOP_06_Properties.py >>> 34 34 >>> Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 21 Vererbung Basisklasse Unterklassen Fahrzeug Marke Farbe Baujahr Kombi Türen Heckklappe() Anlassen() Beschleunigen() Bremsen() Bei der Vererbung erhält (erbt) die abgleitet Klasse (Unterklasse) die Methoden und Attribute der Basisklasse. Betonmischer Zuladung Mischertrommel() Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 22 Vererbung (1) class fahrzeug: def __init__(self, aussentemperatur = 18): self.__aussentemperatur = aussentemperatur def __del__(self): print("Die Klasse fahrzeug wurde gelöscht") def set_aussentemperatur(self, aussentemperatur): if aussentemperatur >= -273.15: self.__aussentemperatur = aussentemperatur else: self.__aussentemperatur = 12 def get_aussentemperatur(self): return self.__aussentemperatur outdoor_temp = property(get_aussentemperatur, set_aussentemperatur) OOP_07_Vererbung.py Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 23 Vererbung (2) def __add__(self, other): return self.outdoor_temp + other.outdoor_temp outdoor_temp = property(get_aussentemperatur, set_aussentemperatur) class kombi(fahrzeug): def __init__(self): fahrzeug.__init__(self) class betonmischer(fahrzeug): def __del__(self): fahrzeug.__del__(self) print("Die betonmischer fahrzeug wurde gelöscht") OOP_07_Vererbung.py Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 24 Vererbung (3) mycar = kombi() print (mycar.outdoor_temp) lkw = betonmischer() print (lkw.outdoor_temp) del mycar del lkw OOP_07_Vererbung.py >>> 18 18 Die Klasse fahrzeug wurde gelöscht Die Klasse fahrzeug wurde gelöscht Die betonmischer fahrzeug wurde gelöscht >>> Vorlesung: Skriptsprachen DHBW Stuttgart - Semester: SS2017 – Dipl.-Ing.(FH) Volker Schepper 05.04.2017 25