de:modul:m320_2024:merkblaetter:klasse

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
de:modul:m320_2024:merkblaetter:klasse [2026/08/30 14:05] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1de:modul:m320_2024:merkblaetter:klasse [2026/08/30 14:13] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden 74.7.243.195
Zeile 1: Zeile 1:
 +====== Merkblatt: Klasse ======
  
 +==== Definition ====
 +<WRAP center info 75%>
 +Eine Klasse ist die Definition der Attribute, Operationen (Methoden) und der Semantik für
 +eine Menge von Objekten. Alle Objekte einer Klasse entsprechen dieser Definition.
 +</WRAP>
 +==== UML-Notation ====
 +{{de:modul:m320_2024:learningunits:lu01:merkblaetter:uml_circle.png?600|}}
 +
 +==== Klassenname ====
 +Er stellt zum einen eine sinnvolle Beschreibung der Klasse dar, ist aber auch der
 +Datentyp der Klasse.\\
 +Der Name der Klasse wird durch ein Substantiv ausgedrückt.
 +<code>
 +class Circle:
 +  ....
 +</code>
 +==== Attributname und Datentyp ====
 +Attribute stellen die in der Klasse benötigten Variablen dar.\\
 +In der OO-Welt gilt die Regel des „data hiding“. Das heisst, dass die Sichtbarkeit der Attribute (Variablen) **private** (**''-''** im Klassendiagramm) sein sollte.
 +<WRAP center round tip 60%>
 +In Python werden private Attribute gekennzeichnet, indem der Attributsname mit einem Underscore (z.B. ''_radius'') beginnen.
 +Dies zeigt an, dass dieses Attribut nicht direkt gelesen bzw. verändert werden sollte.
 +
 +In Python wird der Datentyp in der Regel zur Laufzeit festgelegt.
 +</WRAP>
 +
 +<code>
 +class Kreis:
 +  def __init__(self, value):
 +    self.radius   = value                   # set-Methode für Attribut radius aufrufen
 +    self._center = Point(10.0, 10.0)        # Mittelpunkt wird als Objekt vom Typ Point referenziert.
 +</code>
 +
 +==== Konstruktor und Initalisierung ====
 +Der Konstruktor wird ausgeführt, wenn eine Klasse erzeugt wird. 
 +
 +<WRAP center round tip 60%>
 +In Python heisst der Konstruktor ''_''''_init_''''_''.
 +</WRAP>
 +
 +Wird für ein Attribut ein Initialwert verlangt, so muss dieser im Konstruktor übergeben werden.
 +<code>
 +  circle = Circle(15.5);
 +</code>
 +
 +==== Operationen und Rückgabewert ====
 +Operationen dienen dazu, die Attributswerte eines Objektes zu setzen, zu lesen oder den inneren Zustand des Objekts zu verändern.
 +Operationen können je nach Bedarf unterschiedliche Sichtbarkeiten erhalten (private, friendly, protected, public).
 +Entsprechend der Notation liefert eine Methode einen Rückgabewert (ausser bei None)
 +<code>
 +  # Methode ohne Wertrückgabe (oft als Prozedur bezeichnet)
 +  def move_point(self, to_x, to_y):
 +      self.x = to_x
 +      self.y = to_y
 +      
 +  # Methode mit Wertrückgabe (oft als Funktion bezeichnet)
 +  def is_radius_set(self):
 +    if radius != 0.0:
 +      return True
 +    else:
 +      return False
 +</code>
 +
 +==== setter und getter ====
 +Methoden die zum Schreiben bzw. Lesen eines Attributs verwendet werden, werden als setter und getter bezeichnet.
 +
 +In Python spricht man bei privaten Attributen auch von Properties (Eigenschaften) und hat für deren Nutzung eine eigene Deklaration.
 +
 +=== getter ===
 +Getter dienen dem Auslesen des Wertes eines Attributs.
 +<code>
 +  @property
 +  def radius(self):
 +    return self.__radius
 +</code>
 +
 +Im UML-Klassendiagramm kennzeichnen wir diese Methoden mit ''<<prop>>''.
 +
 +=== setter ===
 +Setter dienen dem Setzen des Wertes eines Attributs.
 +<code>
 +  @radius.setter
 +  def radius(self, value):
 +    self.__radius = value
 +</code>
 +
 +Im UML-Klassendiagramm kennzeichnen wir diese Methoden mit ''<<setter>>''.
 +
 +=== Nutzung ===
 +Properties können im Code wie Variablen genutzt werden. 
 +Es braucht keinen expliziten Methodenaufruf, um deren Werte zu lesen oder zu schreiben.
 +Implizit wird aber der entsprechende Code ausgeführt. 
 +Somit sind auch Verarbeitungen wie z.B. eine Wertzusicherung möglich.
 +<code>
 +  # lesen eines Property (über die getter Methode)
 +  print("Radius des Kreises " + str(circle.radius))
 +  
 +  # schreiben/setzen eines Property (über setter Methode)
 +  circle.radius = 22.45
 +</code>
 +
 +
 +==== Zusicherung ====
 +Der Code muss diese Anforderung erfüllen. Dafür ist in den entsprechenden Operationen zu sorgen.
 +<code>
 +  @radius.setter
 +  def radius(self, value):
 +    if value > 0.0:
 +      self._radius = value
 +</code>
 +
 +
 +==== Sichtbarkeit ====
 +Die Sichtbarkeit sagt aus, wer auf die entsprechenden Attribute und Operationen
 +Zugriff hat
 +  * **''-''** private => Zugriff nur innerhalb der Klasse
 +  * **''#''** protected => Zugriff innerhalb des Vererbungsbaums
 +  * **''+''** public => Zugriff von überall
 +
 +<WRAP center round tip 60%>
 +Im Gegensatz zu anderen Programmiersprachen erzwingt Python keine Sichtbarkeit.
 +Bei privaten Attributen und Methoden ist es üblich, einen Underscore am Anfang des Namens zu schreiben.
 +Dies ist aber nur informativ und verhindert den direkten Zugriff nicht. 
 +</WRAP>
 +
 +----
 +[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] René Probst, bearbeitet durch Marcel Suter