• Keine Ergebnisse gefunden

Informatik I: Einführung in die Programmierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Informatik I: Einführung in die Programmierung"

Copied!
99
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

14. Objekt-orientierte Programmierung: Aggregierung, Properties, Invarianten, Da- tenkapselung

Albert-Ludwigs-Universität Freiburg

(2)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Aggregierung

21.12.2021 P. Thiemann – Info I 2 / 41

(3)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Zusammengesetzte Objekte

Oft sind Objekte aus anderen Objektenzusammengesetzt.

Methodenaufrufen auf eingebetteten Objekten.

Beispiel: ein zusammengesetztes 2D-Objekt, das andere 2D-Objekte enthält, z.B. einen Kreis und ein Rechteck.

(4)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Zusammengesetzte Objekte

Oft sind Objekte aus anderen Objektenzusammengesetzt.

Methodenaufrufe auf ein zusammengesetztes Objekt führen meist zu Methodenaufrufen auf eingebetteten Objekten.

Beispiel: ein zusammengesetztes 2D-Objekt, das andere 2D-Objekte enthält, z.B. einen Kreis und ein Rechteck.

21.12.2021 P. Thiemann – Info I 4 / 41

(5)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Oft sind Objekte aus anderen Objektenzusammengesetzt.

Methodenaufrufe auf ein zusammengesetztes Objekt führen meist zu Methodenaufrufen auf eingebetteten Objekten.

Beispiel: ein zusammengesetztes 2D-Objekt, das andere 2D-Objekte enthält, z.B. einen Kreis und ein Rechteck.

(6)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (1)

Jede Instanz ist ein2D-Objekt, aber eine Position macht keinen Sinn.

Zusätzlich hat jede Instanz als Attribut eineListevon 2D-Objekten.

newgeoclasses.py (1)

@ d a t a c l a s s

c l a s s C o m p o s i t e ( T w o D O b j e c t ):

c o n t e n t s : l i s t[ T w o D O b j e c t ] = f i e l d ( i n i t = F a l s e ) d e f _ _ p o s t _ i n i t _ _ ( s e l f ):

t h i s . c o n t e n t s = []

d e f add ( self , * o b j s : l i s t[ T w o D O b j e c t ]): s e l f . c o n t e n t s . e x t e n d ( o b j s )

d e f rem ( self , obj : T w o D O b j e c t ): s e l f . c o n t e n t s . r e m o v e ( obj )

...

21.12.2021 P. Thiemann – Info I 5 / 41

(7)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (1)

Jede Instanz ist ein2D-Objekt, aber eine Position macht keinen Sinn.

Zusätzlich hat jede Instanz als Attribut eineListevon 2D-Objekten.

@ d a t a c l a s s

c l a s s C o m p o s i t e ( T w o D O b j e c t ):

c o n t e n t s : l i s t[ T w o D O b j e c t ] = f i e l d ( i n i t = F a l s e ) d e f _ _ p o s t _ i n i t _ _ ( s e l f ):

t h i s . c o n t e n t s = []

d e f add ( self , * o b j s : l i s t[ T w o D O b j e c t ]): s e l f . c o n t e n t s . e x t e n d ( o b j s )

d e f rem ( self , obj : T w o D O b j e c t ): s e l f . c o n t e n t s . r e m o v e ( obj )

...

(8)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (1)

Jede Instanz ist ein2D-Objekt, aber eine Position macht keinen Sinn.

Zusätzlich hat jede Instanz als Attribut eineListevon 2D-Objekten.

newgeoclasses.py (1)

@ d a t a c l a s s

c l a s s C o m p o s i t e ( T w o D O b j e c t ):

c o n t e n t s : l i s t[ T w o D O b j e c t ] = f i e l d ( i n i t = F a l s e ) d e f _ _ p o s t _ i n i t _ _ ( s e l f ):

t h i s . c o n t e n t s = []

d e f add ( self , * o b j s : l i s t[ T w o D O b j e c t ]):

s e l f . c o n t e n t s . e x t e n d ( o b j s ) d e f rem ( self , obj : T w o D O b j e c t ):

s e l f . c o n t e n t s . r e m o v e ( obj )

...

21.12.2021 P. Thiemann – Info I 5 / 41

(9)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (2)

Die Methodensize_change,moveundpositionwerden überschrieben.

Wir wälzen das Ändern und Verschieben des zusammengesetzten Objektes auf die Einzelobjekte ab:Delegieren.

d e f s i z e _ c h a n g e ( self , p e r c e n t : f l o a t): f o r obj in s e l f . c o n t e n t s :

obj . s i z e _ c h a n g e ( p e r c e n t )

d e f m o v e ( self , x c h a n g e : float, y c h a n g e : f l o a t): f o r obj in s e l f . c o n t e n t s :

obj . m o v e ( xc h an ge , y c h a n g e ) d e f p o s i t i o n ( s e l f ):

if s e l f . c o n t e n t s :

r e t u r n s e l f . c o n t e n t s [ 0 ] . p o s i t i o n () r e t u r n s u p e r(). p o s i t i o n ()

(10)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (2)

Die Methodensize_change,moveundpositionwerden überschrieben.

Wir wälzen das Ändern und Verschieben des zusammengesetzten Objektes auf die Einzelobjekte ab:Delegieren.

newgeoclasses.py (2)

d e f s i z e _ c h a n g e ( self , p e r c e n t : f l o a t): f o r obj in s e l f . c o n t e n t s :

obj . s i z e _ c h a n g e ( p e r c e n t )

d e f m o v e ( self , x c h a n g e : float, y c h a n g e : f l o a t): f o r obj in s e l f . c o n t e n t s :

obj . m o v e ( xc h an ge , y c h a n g e ) d e f p o s i t i o n ( s e l f ):

if s e l f . c o n t e n t s :

r e t u r n s e l f . c o n t e n t s [ 0 ] . p o s i t i o n () r e t u r n s u p e r(). p o s i t i o n ()

21.12.2021 P. Thiemann – Info I 6 / 41

(11)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Methodensize_change,moveundpositionwerden überschrieben.

Wir wälzen das Ändern und Verschieben des zusammengesetzten Objektes auf die Einzelobjekte ab:Delegieren.

newgeoclasses.py (2)

d e f s i z e _ c h a n g e ( self , p e r c e n t : f l o a t):

f o r obj in s e l f . c o n t e n t s : obj . s i z e _ c h a n g e ( p e r c e n t )

d e f m o v e ( self , x c h a n g e : float, y c h a n g e : f l o a t):

f o r obj in s e l f . c o n t e n t s : obj . m o v e ( xc h an ge , y c h a n g e )

(12)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (3)

Python-Interpreter

>>> c = Circle(x=1,y=2); r = Rectangle(height=10,width=10)

>>> a = Composite()

>>> a.add([r, c])

>>> a.size_change(200)

>>> r.area()

400.0

>>> a.move(40,40)

>>> a.position() (40, 40)

>>> c.position() (41, 42)

>>> b = Composite()

>>> a.add([b])

>>> a.move(-10, -10)

>>> b.position()

21.12.2021 P. Thiemann – Info I 7 / 41

(13)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (3)

Python-Interpreter

>>> c = Circle(x=1,y=2); r = Rectangle(height=10,width=10)

>>> a = Composite()

>>> a.add([r, c])

>>> a.size_change(200)

>>> r.area() 400.0

(40, 40)

>>> c.position() (41, 42)

>>> b = Composite()

>>> a.add([b])

>>> a.move(-10, -10)

>>> b.position()

(14)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (3)

Python-Interpreter

>>> c = Circle(x=1,y=2); r = Rectangle(height=10,width=10)

>>> a = Composite()

>>> a.add([r, c])

>>> a.size_change(200)

>>> r.area() 400.0

>>> a.move(40,40)

>>> a.position()

(40, 40)

>>> c.position() (41, 42)

>>> b = Composite()

>>> a.add([b])

>>> a.move(-10, -10)

>>> b.position()

21.12.2021 P. Thiemann – Info I 7 / 41

(15)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (3)

Python-Interpreter

>>> c = Circle(x=1,y=2); r = Rectangle(height=10,width=10)

>>> a = Composite()

>>> a.add([r, c])

>>> a.size_change(200)

>>> r.area() 400.0

>>> a.move(40,40)

>>> a.position() (40, 40)

>>> b = Composite()

>>> a.add([b])

>>> a.move(-10, -10)

>>> b.position()

(16)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (3)

Python-Interpreter

>>> c = Circle(x=1,y=2); r = Rectangle(height=10,width=10)

>>> a = Composite()

>>> a.add([r, c])

>>> a.size_change(200)

>>> r.area() 400.0

>>> a.move(40,40)

>>> a.position() (40, 40)

>>> c.position()

(41, 42)

>>> b = Composite()

>>> a.add([b])

>>> a.move(-10, -10)

>>> b.position()

21.12.2021 P. Thiemann – Info I 7 / 41

(17)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (3)

Python-Interpreter

>>> c = Circle(x=1,y=2); r = Rectangle(height=10,width=10)

>>> a = Composite()

>>> a.add([r, c])

>>> a.size_change(200)

>>> r.area() 400.0

>>> a.move(40,40)

>>> a.position() (40, 40)

>>> c.position() (41, 42)

>>> a.move(-10, -10)

>>> b.position()

(18)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Die Klasse Composite (3)

Python-Interpreter

>>> c = Circle(x=1,y=2); r = Rectangle(height=10,width=10)

>>> a = Composite()

>>> a.add([r, c])

>>> a.size_change(200)

>>> r.area() 400.0

>>> a.move(40,40)

>>> a.position() (40, 40)

>>> c.position() (41, 42)

>>> b = Composite()

>>> a.add([b])

>>> a.move(-10, -10)

>>> b.position()

21.12.2021 P. Thiemann – Info I 7 / 41

(19)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Python-Interpreter

>>> c = Circle(x=1,y=2); r = Rectangle(height=10,width=10)

>>> a = Composite()

>>> a.add([r, c])

>>> a.size_change(200)

>>> r.area() 400.0

>>> a.move(40,40)

>>> a.position() (40, 40)

>>> c.position() (41, 42)

>>> b = Composite()

(20)

Aggregie- rung

Properties Operator- Überladung Zusammen- fassung

Vererbung und Komposition

21.12.2021 P. Thiemann – Info I 8 / 41

(21)

Properties Operator- Überladung Zusammen- fassung

Properties

(22)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden. Es soll nicht möglich sein, unsinnige Attributwerte zu setzen. Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern. Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Getter-Methode liest ein privates Attribut. Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

21.12.2021 P. Thiemann – Info I 11 / 41

(23)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Getter-Methode liest ein privates Attribut. Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

(24)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern. Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Getter-Methode liest ein privates Attribut. Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

21.12.2021 P. Thiemann – Info I 11 / 41

(25)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern. Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

(26)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern.

Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Getter-Methode liest ein privates Attribut. Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

21.12.2021 P. Thiemann – Info I 11 / 41

(27)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern.

Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

(28)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern.

Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Getter-Methode liest ein privates Attribut. Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

21.12.2021 P. Thiemann – Info I 11 / 41

(29)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern.

Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

(30)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern.

Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Getter-Methode liest ein privates Attribut.

Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

21.12.2021 P. Thiemann – Info I 11 / 41

(31)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern.

Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Getter-Methode liest ein privates Attribut.

Getter und Setter alsPropertiesgeschützt werden.

(32)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zugriff auf Attribute kontrollieren:

Getter und Setter

Ziel ist dieKontrolleüber das Abfragen und Setzen von Attributwerten.

Invarianten zwischen Attributwerten sollen respektiert werden.

Es soll nicht möglich sein, unsinnige Attributwerte zu setzen.

Der Zustand eines Objekts soll gekapselt werden.

In anderen Sprachen können Attribute alsprivatdeklariert werden.

Nur Methoden des zugehörigen Objekts können sie lesen bzw. ändern.

Sie sind unsichtbar für Objekte anderer Klassen.

⇒ Datenkapselung;Invariantenkönnen garantiert werden.

Für den Zugriff durch andere Objekte werden (häufig)Getter- und (seltener) Setter-Methoden bereitgestellt.

Eine Getter-Methode liest ein privates Attribut.

Eine Setter-Methode schreibt ein privates Attribut.

In Python sind Attribute im wesentlichenöffentlich, aber sie können durch Getter und Setter alsPropertiesgeschützt werden.

21.12.2021 P. Thiemann – Info I 11 / 41

(33)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Datenkapselung und Invarianten

Definition: Dateninvariante

Eine Dateninvariante ist eine logische Aussage über die Attribute eines Objekts, die während der gesamten Lebensdauer des Objekts erfüllt sein muss.

Der Konstruktor muss die Dateninvariante sicherstellen.

Die Methoden müssen die Dateninvariante erhalten.

Unbewachtes Ändern eines Attributs kann die Dateninvariante zerstören.

Attribute (Objektzustand) können nicht direkt gelesen oder geändert werden. Die Interaktion mit einem Objekt geschieht nur durch Methoden.

Die Implementierung (Struktur des Objektzustands) kann verändert werden, ohne dass andere Teile des Programms geändert werden müssen.

(34)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Datenkapselung und Invarianten

Definition: Dateninvariante

Eine Dateninvariante ist eine logische Aussage über die Attribute eines Objekts, die während der gesamten Lebensdauer des Objekts erfüllt sein muss.

Der Konstruktor muss die Dateninvariante sicherstellen.

Die Methoden müssen die Dateninvariante erhalten.

Unbewachtes Ändern eines Attributs kann die Dateninvariante zerstören.

Definition: Datenkapselung

Attribute (Objektzustand) können nicht direkt gelesen oder geändert werden.

Die Interaktion mit einem Objekt geschieht nur durch Methoden.

Die Implementierung (Struktur des Objektzustands) kann verändert werden, ohne dass andere Teile des Programms geändert werden müssen.

21.12.2021 P. Thiemann – Info I 12 / 41

(35)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Invariante

Das Attributradiusder KlasseCirclesoll immer größer als Null sein.

Regel 1:Jede Invariantemussim docstring der Klasse dokumentiert sein!

@ d a t a c l a s s

c l a s s C i r c l e ( T w o D O b j e c t ):

' ' ' R e p r e s e n t s a c i r c l e in t h e p l a n e . A t t r i b u t e s :

r a d i u s : a n u m b e r i n d i c a t i n g t h e r a d i u s of t h e c i r c l e x , y : i n h e r i t e d f r o m T w o D O b j e c t

(36)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Beispiel Invariante: Radius eines Kreises

Der docstring kann Verletzungen der Invariante nicht verhindern. . . Regel 2:Der Konstruktor muss die Einhaltung der Invariante prüfen!

Die Prüfung geschieht durch eine Assertion in einer spezielle Methode __post_init__. Verletzung führt zu einerException(Ausnahme).

__post_init__wird automatisch bei Konstruktion einer Instanz einer Datenklasse aufgerufen.

@ d a t a c l a s s

c l a s s C i r c l e ( T w o D O b j e c t ):

...

r a d i u s : f l o a t

d e f _ _ p o s t _ i n i t _ _ ( s e l f ):

a s s e r t s e l f . r a d i u s > 0 , " r a d i u s ␣ s h o u l d ␣ be ␣ g r e a t e r ␣ t h a n ␣ 0 "

21.12.2021 P. Thiemann – Info I 14 / 41

(37)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Bei falschem Aufruf des Konstruktors wird eine Exception ausgelöst.

Python-Interpreter

>>> c = Circle (x=10,y=20, radius=-3) Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File ".../properties.py", line 46, in __init__

assert radius > 0, "radius should be greater than 0"

(38)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Beispiel: Radius eines Kreises

Ein böswilliger Mensch kann immer noch folgenden Code schreiben:

c = C i r c l e ( x =20 , y =20 , r a d i u s =5)

c . r a d i u s = -3 # # o b j e c t in var i a n t b r o k e n

Regel 3:Das Attributradiusmuss als Property ohne Setter definiert werden!

@ d a t a c l a s s

c l a s s C i r c l e ( T w o D O b j e c t ):

...

_ _ r a d i u s : f l o a t # # N a m e n v o n P r o p e r t i e s b e g i n n e n m i t __

d e f _ _ p o s t _ i n i t _ _ ( s e l f ):

a s s e r t s e l f . _ _ r a d i u s > 0 , " r a d i u s ␣ s h o u l d ␣ be ␣ g r e a t e r ␣ t h a n ␣ 0 "

@ p r o p e r t y

d e f r a d i u s ( s e l f ) - > f l o a t: r e t u r n s e l f . _ _ r a d i u s

21.12.2021 P. Thiemann – Info I 16 / 41

(39)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Was passiert?

Der Attributwert für den Radius wird im Feld__radiusdes Objekts gespeichert.

Felder, deren Name mit__beginnt, sind von außen nicht ohne weiteres zugreifbar!

radiusist eine normaleMethode, derGetterfürradius.

Die Dekoration mit@propertybewirkt, dassradiuswie ein Attribut verwendet werden kann.

Ein Attributzugriffc.radiuswird als Methodenaufrufc.radius()interpretiert.

>>> c = Circle (x=10,y=20, radius=3)

>>> c.radius 3

>>> c.x = -3

Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: can’t set attribute

(40)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Was passiert?

Der Attributwert für den Radius wird im Feld__radiusdes Objekts gespeichert.

Felder, deren Name mit__beginnt, sind von außen nicht ohne weiteres zugreifbar!

radiusist eine normaleMethode, derGetterfürradius.

Die Dekoration mit@propertybewirkt, dassradiuswie ein Attribut verwendet werden kann.

Ein Attributzugriffc.radiuswird als Methodenaufrufc.radius()interpretiert.

Python-Interpreter

>>> c = Circle (x=10,y=20, radius=3)

>>> c.radius 3

>>> c.x = -3

Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: can’t set attribute

21.12.2021 P. Thiemann – Info I 17 / 41

(41)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Was passiert?

Der Attributwert für den Radius wird im Feld__radiusdes Objekts gespeichert.

Felder, deren Name mit__beginnt, sind von außen nicht ohne weiteres zugreifbar!

radiusist eine normaleMethode, derGetterfürradius.

Die Dekoration mit@propertybewirkt, dassradiuswie ein Attribut verwendet werden kann.

Ein Attributzugriffc.radiuswird als Methodenaufrufc.radius()interpretiert.

>>> c = Circle (x=10,y=20, radius=3)

>>> c.radius 3

>>> c.x = -3

Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: can’t set attribute

(42)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Was passiert?

Der Attributwert für den Radius wird im Feld__radiusdes Objekts gespeichert.

Felder, deren Name mit__beginnt, sind von außen nicht ohne weiteres zugreifbar!

radiusist eine normaleMethode, derGetterfürradius.

Die Dekoration mit@propertybewirkt, dassradiuswie ein Attribut verwendet werden kann.

Ein Attributzugriffc.radiuswird als Methodenaufrufc.radius()interpretiert.

Python-Interpreter

>>> c = Circle (x=10,y=20, radius=3)

>>> c.radius 3

>>> c.x = -3

Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: can’t set attribute

21.12.2021 P. Thiemann – Info I 17 / 41

(43)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Der Attributwert für den Radius wird im Feld__radiusdes Objekts gespeichert.

Felder, deren Name mit__beginnt, sind von außen nicht ohne weiteres zugreifbar!

radiusist eine normaleMethode, derGetterfürradius.

Die Dekoration mit@propertybewirkt, dassradiuswie ein Attribut verwendet werden kann.

Ein Attributzugriffc.radiuswird als Methodenaufrufc.radius()interpretiert.

Python-Interpreter

>>> c = Circle (x=10,y=20, radius=3)

>>> c.radius 3

(44)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Zusammenfassung Invariante

Eine (Daten-) Invariante ist eine logische Aussage über die Attribute eines Objekts, die während der gesamten Lebensdauer des Objekts erfüllt sein muss.

Regeln zu Dateninvarianten

1 Jede Invariante muss im docstring der Klasse dokumentiert sein!

2 Der Konstruktor muss die Einhaltung der Invariante prüfen!

3 Die Attribute, die in der Invariante erwähnt werden, müssen als Properties ohne Setter definiert werden!

21.12.2021 P. Thiemann – Info I 18 / 41

(45)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Beispiel: Datenkapselung

Aufgabe

Ein Zeichenprogramm verwendet Punkte in der Ebene. Eine wichtige Operation auf Punkten ist die Drehung (um den Ursprung) um einen bestimmten Winkel.

@ d a t a c l a s s c l a s s P o i n t 2 D :

x : f l o a t y : f l o a t

d e f t u r n ( self , phi : f l o a t):

s e l f . x , s e l f . y = ( s e l f . x * cos ( phi ) - s e l f . y * sin ( phi ) , s e l f . x * sin ( phi ) + s e l f . y * cos ( phi ))

(46)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Beispiel: Datenkapselung

Aufgabe

Ein Zeichenprogramm verwendet Punkte in der Ebene. Eine wichtige Operation auf Punkten ist die Drehung (um den Ursprung) um einen bestimmten Winkel.

Erster Versuch

@ d a t a c l a s s c l a s s P o i n t 2 D :

x : f l o a t y : f l o a t

d e f t u r n ( self , phi : f l o a t):

s e l f . x , s e l f . y = ( s e l f . x * cos ( phi ) - s e l f . y * sin ( phi ) , s e l f . x * sin ( phi ) + s e l f . y * cos ( phi ))

21.12.2021 P. Thiemann – Info I 19 / 41

(47)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Python-Interpreter

>>> pp = Point2D(1,0)

>>> pp.x, pp.y (1, 0)

>>> pp.turn(pi/2)

>>> pp.x, pp.y

(6.123233995736766e-17, 1.0)

>>> pp.y = -1

>>> pp.turn (pi/2)

(48)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Beobachtungen

Das Interface vonPoint2DObjekten besteht aus den Attributenx,yund der Methodeturn().

Jeder Aufruf vonturn()erfordert vier trigonometrische Operationen (naja, mindestens zwei), die aufwändig zu berechnen sind.

Möglichkeit zur Vermeidung der trigonometrischen Operationen:

Ändere die Datenrepräsentationvon rechtwinkligen Koordinaten (x, y) in Polarkoordinaten(r,ϑ). In Polarkoordinaten entspricht eine Drehung umϕ der Addition der Winkelϑ+ϕ.

Aber: das Interface soll erhalten bleiben!

Ein Fall für Datenkapselung mit GetternundSettern! (keine Invariante:xundysind beliebigefloatZahlen!)

21.12.2021 P. Thiemann – Info I 21 / 41

(49)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Beobachtungen

Das Interface vonPoint2DObjekten besteht aus den Attributenx,yund der Methodeturn().

Jeder Aufruf vonturn()erfordert vier trigonometrische Operationen (naja, mindestens zwei), die aufwändig zu berechnen sind.

Ändere die Datenrepräsentationvon rechtwinkligen Koordinaten (x, y) in Polarkoordinaten(r,ϑ). In Polarkoordinaten entspricht eine Drehung umϕ der Addition der Winkelϑ+ϕ.

Aber: das Interface soll erhalten bleiben!

Ein Fall für Datenkapselung mit GetternundSettern! (keine Invariante:xundysind beliebigefloatZahlen!)

(50)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Beobachtungen

Das Interface vonPoint2DObjekten besteht aus den Attributenx,yund der Methodeturn().

Jeder Aufruf vonturn()erfordert vier trigonometrische Operationen (naja, mindestens zwei), die aufwändig zu berechnen sind.

Möglichkeit zur Vermeidung der trigonometrischen Operationen:

Ändere die Datenrepräsentationvon rechtwinkligen Koordinaten (x, y) in Polarkoordinaten(r,ϑ). In Polarkoordinaten entspricht eine Drehung umϕ der Addition der Winkelϑ+ϕ.

Aber: das Interface soll erhalten bleiben!

Ein Fall für Datenkapselung mit GetternundSettern! (keine Invariante:xundysind beliebigefloatZahlen!)

21.12.2021 P. Thiemann – Info I 21 / 41

(51)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Beobachtungen

Das Interface vonPoint2DObjekten besteht aus den Attributenx,yund der Methodeturn().

Jeder Aufruf vonturn()erfordert vier trigonometrische Operationen (naja, mindestens zwei), die aufwändig zu berechnen sind.

Möglichkeit zur Vermeidung der trigonometrischen Operationen:

Ändere die Datenrepräsentationvon rechtwinkligen Koordinaten (x, y) in Polarkoordinaten(r,ϑ). In Polarkoordinaten entspricht eine Drehung umϕ der Addition der Winkelϑ+ϕ.

Aber: das Interface soll erhalten bleiben!

(keine Invariante:xundysind beliebigefloatZahlen!)

(52)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Beobachtungen

Das Interface vonPoint2DObjekten besteht aus den Attributenx,yund der Methodeturn().

Jeder Aufruf vonturn()erfordert vier trigonometrische Operationen (naja, mindestens zwei), die aufwändig zu berechnen sind.

Möglichkeit zur Vermeidung der trigonometrischen Operationen:

Ändere die Datenrepräsentationvon rechtwinkligen Koordinaten (x, y) in Polarkoordinaten(r,ϑ). In Polarkoordinaten entspricht eine Drehung umϕ der Addition der Winkelϑ+ϕ.

Aber: das Interface soll erhalten bleiben!

Ein Fall für Datenkapselung mit GetternundSettern!

(keine Invariante:xundysind beliebigefloatZahlen!)

21.12.2021 P. Thiemann – Info I 21 / 41

(53)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Das Interface vonPoint2DObjekten besteht aus den Attributenx,yund der Methodeturn().

Jeder Aufruf vonturn()erfordert vier trigonometrische Operationen (naja, mindestens zwei), die aufwändig zu berechnen sind.

Möglichkeit zur Vermeidung der trigonometrischen Operationen:

Ändere die Datenrepräsentationvon rechtwinkligen Koordinaten (x, y) in Polarkoordinaten(r,ϑ). In Polarkoordinaten entspricht eine Drehung umϕ der Addition der Winkelϑ+ϕ.

Aber: das Interface soll erhalten bleiben!

(54)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Datenkapselung: Änderung der Repräsentation ohne Änderung des Interface

@ d a t a c l a s s

c l a s s P o i n t P o l a r : x : I n i t V a r [f l o a t] y : I n i t V a r [f l o a t]

d e f _ _ p o s t _ i n i t _ _ ( self , x :float, y :f l o a t):

s e l f . __r = s q r t ( x * x + y * y ) s e l f . _ _ t h e t a = a t a n 2 ( y , x ) d e f t u r n ( self , phi :f l o a t):

s e l f . _ _ t h e t a += phi

...

xundydefinieren nur die Parameter für den Konstruktor (Effekt vonInitVar) Interne Repräsentation durch Polarkoordinaten

Interne Attribute__rund__thetavon außen nicht zugreifbar

21.12.2021 P. Thiemann – Info I 22 / 41

(55)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

@ p r o p e r t y

d e f x ( s e l f ) - > f l o a t:

r e t u r n s e l f . __r * cos ( s e l f . _ _ t h e t a )

@ p r o p e r t y

d e f y ( s e l f ) - > f l o a t:

r e t u r n s e l f . __r * sin ( s e l f . _ _ t h e t a )

@x . s e t t e r

d e f x ( self , x : f l o a t):

s e l f . _ _ p o s t _ i n i t _ _ ( x , s e l f . y )

@y . s e t t e r

d e f y ( self , y : f l o a t):

s e l f . _ _ p o s t _ i n i t _ _ ( s e l f . x , y )

Definition der Getter wie gehabt.

(56)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Was passiert? Exakt das Gleiche wie mit

Point2D

!

Python-Interpreter

>>> pp = PointPolar(1,0)

>>> pp.x, pp.y (1, 0)

>>> pp.turn(pi/2)

>>> pp.x, pp.y

(6.123233995736766e-17, 1.0)

>>> pp.y = -1

>>> pp.turn (pi/2)

>>> pp.x, pp.y (1.0, 0.0)

21.12.2021 P. Thiemann – Info I 24 / 41

(57)

Aggregie- rung Properties Operator- Überladung Zusammen- fassung

Intern könnte der PunktbeideRepräsentationen unterstützen.

Nur die jeweils benötigte Repräsentation wird berechnet.

Transformationen werden immer in der günstigsten Repräsentation ausgeführt:

Rotation in Polarkoordinaten, Translation in rechtwinkligen Koordinaten, usw.

(58)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Operator-Überladung

21.12.2021 P. Thiemann – Info I 26 / 41

(59)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Überladung von Operatoren

EinOperatoristüberladen(operator overloading), wenn dieser Operator je nach Typ der Argumente (und ggf. dem Kontext) unterschiedlich definiert ist.

Traditionell sind die arithmetischen Operatoren in vielen Programmiersprachen für alle numerischen Typen überladen.

In Python sind außerdem die Operatoren „+“ und „*“ für Strings überladen. Für gewisse Operatoren können wir Überladung selbst definieren!

Überladung ist immer mit Vorsicht zu geniessen:

wenn überladene Operatoren vorkommen.

Eine Überladung darf nicht “die Intuition” eines Operators verletzen.

Beispiel: „+“ (auf Zahlen) hat Eigenschaften wie Kommutativität, Assoziativität, 0 als neutrales Element, etc, die durch Überladung nicht gestört werden sollten.

(60)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Überladung von Operatoren

EinOperatoristüberladen(operator overloading), wenn dieser Operator je nach Typ der Argumente (und ggf. dem Kontext) unterschiedlich definiert ist.

Traditionell sind die arithmetischen Operatoren in vielen Programmiersprachen für alle numerischen Typen überladen.

In Python sind außerdem die Operatoren „+“ und „*“ für Strings überladen. Für gewisse Operatoren können wir Überladung selbst definieren!

Überladung ist immer mit Vorsicht zu geniessen:

Im Programmtext ist es nicht mehr offensichtlich, welcher Code ausgeführt wird, wenn überladene Operatoren vorkommen.

Eine Überladung darf nicht “die Intuition” eines Operators verletzen.

Beispiel: „+“ (auf Zahlen) hat Eigenschaften wie Kommutativität, Assoziativität, 0 als neutrales Element, etc, die durch Überladung nicht gestört werden sollten.

21.12.2021 P. Thiemann – Info I 28 / 41

(61)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Überladung von Operatoren

EinOperatoristüberladen(operator overloading), wenn dieser Operator je nach Typ der Argumente (und ggf. dem Kontext) unterschiedlich definiert ist.

Traditionell sind die arithmetischen Operatoren in vielen Programmiersprachen für alle numerischen Typen überladen.

In Python sind außerdem die Operatoren „+“ und „*“ für Strings überladen.

Für gewisse Operatoren können wir Überladung selbst definieren! Überladung ist immer mit Vorsicht zu geniessen:

wenn überladene Operatoren vorkommen.

Eine Überladung darf nicht “die Intuition” eines Operators verletzen.

Beispiel: „+“ (auf Zahlen) hat Eigenschaften wie Kommutativität, Assoziativität, 0 als neutrales Element, etc, die durch Überladung nicht gestört werden sollten.

(62)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Überladung von Operatoren

EinOperatoristüberladen(operator overloading), wenn dieser Operator je nach Typ der Argumente (und ggf. dem Kontext) unterschiedlich definiert ist.

Traditionell sind die arithmetischen Operatoren in vielen Programmiersprachen für alle numerischen Typen überladen.

In Python sind außerdem die Operatoren „+“ und „*“ für Strings überladen.

Für gewisse Operatoren können wir Überladung selbst definieren!

Überladung ist immer mit Vorsicht zu geniessen:

Im Programmtext ist es nicht mehr offensichtlich, welcher Code ausgeführt wird, wenn überladene Operatoren vorkommen.

Eine Überladung darf nicht “die Intuition” eines Operators verletzen.

Beispiel: „+“ (auf Zahlen) hat Eigenschaften wie Kommutativität, Assoziativität, 0 als neutrales Element, etc, die durch Überladung nicht gestört werden sollten.

21.12.2021 P. Thiemann – Info I 28 / 41

(63)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Überladung von Operatoren

EinOperatoristüberladen(operator overloading), wenn dieser Operator je nach Typ der Argumente (und ggf. dem Kontext) unterschiedlich definiert ist.

Traditionell sind die arithmetischen Operatoren in vielen Programmiersprachen für alle numerischen Typen überladen.

In Python sind außerdem die Operatoren „+“ und „*“ für Strings überladen.

Für gewisse Operatoren können wir Überladung selbst definieren!

Überladung ist immer mit Vorsicht zu geniessen:

wenn überladene Operatoren vorkommen.

Eine Überladung darf nicht “die Intuition” eines Operators verletzen.

Beispiel: „+“ (auf Zahlen) hat Eigenschaften wie Kommutativität, Assoziativität, 0 als neutrales Element, etc, die durch Überladung nicht gestört werden sollten.

(64)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Überladung von Operatoren

EinOperatoristüberladen(operator overloading), wenn dieser Operator je nach Typ der Argumente (und ggf. dem Kontext) unterschiedlich definiert ist.

Traditionell sind die arithmetischen Operatoren in vielen Programmiersprachen für alle numerischen Typen überladen.

In Python sind außerdem die Operatoren „+“ und „*“ für Strings überladen.

Für gewisse Operatoren können wir Überladung selbst definieren!

Überladung ist immer mit Vorsicht zu geniessen:

Im Programmtext ist es nicht mehr offensichtlich, welcher Code ausgeführt wird, wenn überladene Operatoren vorkommen.

Eine Überladung darf nicht “die Intuition” eines Operators verletzen.

Beispiel: „+“ (auf Zahlen) hat Eigenschaften wie Kommutativität, Assoziativität, 0 als neutrales Element, etc, die durch Überladung nicht gestört werden sollten.

21.12.2021 P. Thiemann – Info I 28 / 41

(65)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Überladung von Operatoren

EinOperatoristüberladen(operator overloading), wenn dieser Operator je nach Typ der Argumente (und ggf. dem Kontext) unterschiedlich definiert ist.

Traditionell sind die arithmetischen Operatoren in vielen Programmiersprachen für alle numerischen Typen überladen.

In Python sind außerdem die Operatoren „+“ und „*“ für Strings überladen.

Für gewisse Operatoren können wir Überladung selbst definieren!

Überladung ist immer mit Vorsicht zu geniessen:

Im Programmtext ist es nicht mehr offensichtlich, welcher Code ausgeführt wird, wenn überladene Operatoren vorkommen.

0 als neutrales Element, etc, die durch Überladung nicht gestört werden sollten.

(66)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Überladung von Operatoren

EinOperatoristüberladen(operator overloading), wenn dieser Operator je nach Typ der Argumente (und ggf. dem Kontext) unterschiedlich definiert ist.

Traditionell sind die arithmetischen Operatoren in vielen Programmiersprachen für alle numerischen Typen überladen.

In Python sind außerdem die Operatoren „+“ und „*“ für Strings überladen.

Für gewisse Operatoren können wir Überladung selbst definieren!

Überladung ist immer mit Vorsicht zu geniessen:

Im Programmtext ist es nicht mehr offensichtlich, welcher Code ausgeführt wird, wenn überladene Operatoren vorkommen.

Eine Überladung darf nicht “die Intuition” eines Operators verletzen.

Beispiel: „+“ (auf Zahlen) hat Eigenschaften wie Kommutativität, Assoziativität, 0 als neutrales Element, etc, die durch Überladung nicht gestört werden sollten.

21.12.2021 P. Thiemann – Info I 28 / 41

(67)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Beispiel: Addition für 2D-Punkte

point2d.py (1)

c l a s s P o i n t 2 D : ...

d e f _ _ a d d _ _ ( self , o t h e r ):

r e t u r n P o i n t 2 D ( s e l f . x + o t h e r . x , s e l f . y + o t h e r . y )

Die dunder1Methode__add__definiert die Überladung des „+“-Operators.

Methodenaufrufpp.__add__(v)interpretiert. Was fehlt hier?

Was passiert, wennotherkeine Instanz vonPoint2Dist?

(68)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Beispiel: Addition für 2D-Punkte

point2d.py (1)

c l a s s P o i n t 2 D : ...

d e f _ _ a d d _ _ ( self , o t h e r ):

r e t u r n P o i n t 2 D ( s e l f . x + o t h e r . x , s e l f . y + o t h e r . y )

Die dunder1Methode__add__definiert die Überladung des „+“-Operators.

Wennpp = Point2D (...), dann wird eine “Addition”pp + vals Methodenaufrufpp.__add__(v)interpretiert.

Was fehlt hier?

Was passiert, wennotherkeine Instanz vonPoint2Dist?

1dunder = double underline

21.12.2021 P. Thiemann – Info I 29 / 41

(69)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Beispiel: Addition für 2D-Punkte

point2d.py (1)

c l a s s P o i n t 2 D : ...

d e f _ _ a d d _ _ ( self , o t h e r ):

r e t u r n P o i n t 2 D ( s e l f . x + o t h e r . x , s e l f . y + o t h e r . y )

Die dunder1Methode__add__definiert die Überladung des „+“-Operators.

Wennpp = Point2D (...), dann wird eine “Addition”pp + vals Methodenaufrufpp.__add__(v)interpretiert.

(70)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

Beispiel: Addition für 2D-Punkte

point2d.py (1)

c l a s s P o i n t 2 D : ...

d e f _ _ a d d _ _ ( self , o t h e r ):

r e t u r n P o i n t 2 D ( s e l f . x + o t h e r . x , s e l f . y + o t h e r . y )

Die dunder1Methode__add__definiert die Überladung des „+“-Operators.

Wennpp = Point2D (...), dann wird eine “Addition”pp + vals Methodenaufrufpp.__add__(v)interpretiert.

Was fehlt hier?

Was passiert, wennotherkeine Instanz vonPoint2Dist?

1dunder = double underline

21.12.2021 P. Thiemann – Info I 29 / 41

(71)

Aggregie- rung Properties Operator- Überladung

Arithmetische Operatoren Vergleichsoperato- ren

Zusammen- fassung

point2d.py

c l a s s P o i n t 2 D : ...

d e f _ _ a d d _ _ ( self , o t h e r : P o i n t 2 D ):

if i s i n s t a n c e ( other , P o i n t 2 D ):

r e t u r n P o i n t 2 D ( s e l f . x + o t h e r . x , s e l f . y + o t h e r . y ) e l s e:

r a i s e T y p e E r r o r ( " C a n n o t ␣ add ␣ P o i n t 2 D ␣ and ␣ " + s t r (t y p e ( o t h e r )))

Der Funktionsaufrufisinstance (other, Point2D)testet, obothereine

Referenzen

ÄHNLICHE DOKUMENTE

Im Nebenfach Informatik gelten die Regelungen des Instituts für Informatik (Wiederholung nicht bestandener Klausuren beliebig oft; einmalig auch zur Notenverbesserung). Sonst

Entfernen (oder private-Machen) der Zugriffsmethoden = kein Zugriff von außen mehr möglich.

(aber keine Möglichkeit, Kontostand von außen zu verändern, so lange keine. entsprechende Setter-Methode

primitiv: boolean, byte, short, char, int, float, double, long vordefiniert: String, Buffered

Python kann auf eine von zwei Arten verwendet werden: Entweder als schnelles Tool in der Kommandozeile, oder indem man die Pythonanweisungen in einer Datei speichert und diese Datei

 Erstes Zeichen darf nicht Ziffer sein - blub und _bla sind ok. - 2pi nicht

Der Partikel wandert zufällig durch das 2-D Gitter bis - er einen anderen Partikel berührt ⇒. dann wird er dort angelagert - er das Gitter wieder

Fühlst du dich sicher im Stoff? Dann kannst du bei unserem Tutor den Kapiteltest machen. Wenn du ihn bestehst, darfst du das nächste Kapitel oder das Additum bearbeiten. + Additum