Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m320_2024:learningunits:lu01:gleichartig [2026/08/30 14:05] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | de:modul:m320_2024:learningunits:lu01:gleichartig [2026/08/30 14:06] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden msuter | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== LU01d - Ist Klasse gleich Klasse? ====== | ||
| + | Warum stellen wir uns diese Frage? | ||
| + | |||
| + | Sie haben im ([[de: | ||
| + | Dabei haben Sie eine Klasse als Ansammlung vieler Attribute kennengelernt. | ||
| + | Man nennt solche Klassen (informell) auch Datenklassen (POPO - Plain Old Python Object). | ||
| + | |||
| + | In einigen Programmiersprachen oder Frameworks wird der Begriff " | ||
| + | Solche Klassen haben normalerweise private Datenfelder (Variablen) und öffentliche Getter- und Setter-Methoden, | ||
| + | Sie enthalten normalerweise keine komplexe Geschäftslogik oder spezielle Verhaltensmethoden. | ||
| + | Eine " | ||
| + | |||
| + | ==== Beispiel: Dataklasse und Standardklasse ==== | ||
| + | |||
| + | {{modul: | ||
| + | |||
| + | //Abb. Beschreibung einer Person mit deren Adresse// | ||
| + | |||
| + | |||
| + | Wir finden in Abbildung die zwei Klassen '' | ||
| + | |||
| + | Die Klasse '' | ||
| + | * street | ||
| + | * number | ||
| + | * postal_code | ||
| + | * city | ||
| + | |||
| + | |||
| + | die durch set- und get-Methoden geschrieben (set) bzw. gelesen (get) werden. | ||
| + | Weitere Methoden werden kaum benötigt. | ||
| + | Es handelt sich hier um eine typische Datenklasse. | ||
| + | |||
| + | Dagegen wird die Person durch eine Vielzahl von Eigenschaften wie z.B. | ||
| + | * size | ||
| + | * hair_color | ||
| + | * weight | ||
| + | * ... | ||
| + | und Methoden wie | ||
| + | * breath() | ||
| + | * eat() | ||
| + | * go() | ||
| + | * ... | ||
| + | beschrieben. Zu diesen Attributen finden sich dann auch wieder set- und get-Methoden. | ||
| + | |||
| + | ==== Was aber bedeutet das für die Programmierung in Python? ==== | ||
| + | Wir betrachten uns hier die beiden Klassen '' | ||
| + | |||
| + | |||
| + | === Beispiel: Codierung einer Datenklasse und einer " | ||
| + | {|style = " | ||
| + | |- | ||
| + | !style = " | ||
| + | !style = " | ||
| + | |- | ||
| + | |style=" | ||
| + | <code Python> | ||
| + | from dataclasses import dataclass | ||
| + | |||
| + | |||
| + | @dataclass | ||
| + | class Address: | ||
| + | """ | ||
| + | Represents a residential address | ||
| + | """ | ||
| + | street: str = None | ||
| + | number: str = None # String since 11a or similar are possible, | ||
| + | postal_code: | ||
| + | city: str = None | ||
| + | |||
| + | # Durch den Decorator @dataclass wird unter anderem der Konstruktor generiert. | ||
| + | @property | ||
| + | def street(self): | ||
| + | return self._street | ||
| + | |||
| + | @street.setter | ||
| + | def street(self, | ||
| + | self._street = value | ||
| + | |||
| + | @property | ||
| + | def number(self): | ||
| + | return self._number | ||
| + | |||
| + | @number.setter | ||
| + | def number(self, | ||
| + | self._postal_code = value | ||
| + | |||
| + | @property | ||
| + | def postal_code(self): | ||
| + | return self._postal_code | ||
| + | |||
| + | @postal_code.setter | ||
| + | def postal_code(self, | ||
| + | self._number = value | ||
| + | |||
| + | @property | ||
| + | def city(self): | ||
| + | return self._city | ||
| + | |||
| + | @city.setter | ||
| + | def city(self, value): | ||
| + | self._city = value | ||
| + | </ | ||
| + | |style=" | ||
| + | <code Python> | ||
| + | from address import Address | ||
| + | |||
| + | |||
| + | class Human: | ||
| + | """ | ||
| + | Represents a human being with some attributs and abilities. | ||
| + | """ | ||
| + | |||
| + | # Hier wird ein expliziter Konstruktor angeschrieben. | ||
| + | # Mehr zur Bedeutung des Konstruktors folgt später. | ||
| + | def __init__(self, | ||
| + | self._name = name | ||
| + | self._weight = weight | ||
| + | self._eye_color = eye_color | ||
| + | # hier können ganz viele weitere Attribute stehen, die durch | ||
| + | # den Konstruktor initialisiert werden. | ||
| + | self._address = one_address | ||
| + | |||
| + | def __repr__(self): | ||
| + | return f' | ||
| + | |||
| + | # Attribute werden über get-Methoden gelesen. | ||
| + | # Python kennt dazu den Dekorator @property. | ||
| + | # Hier als Beispiel drei Methoden. | ||
| + | @property | ||
| + | def weight(self): | ||
| + | return self._weight | ||
| + | |||
| + | @property | ||
| + | def name(self): | ||
| + | return self._name | ||
| + | |||
| + | @property | ||
| + | def eye_color(self): | ||
| + | return self._eye_color | ||
| + | |||
| + | @property | ||
| + | def address(self): | ||
| + | return self._address | ||
| + | |||
| + | # Attribute werden über set-Methoden gesetzt. | ||
| + | # ACHTUNG: Es gibt Attribute, die einmalig bei der Initialisierung | ||
| + | # gesetzt werden, hier z.B. die Augenfarbe. | ||
| + | # Python nutzt hier den @.setter Dekorator. | ||
| + | # Hier als Beispiel wieder nur eine Methode. | ||
| + | @address.setter | ||
| + | def address(self, | ||
| + | self._address = new_address | ||
| + | |||
| + | # Und hier folgen Methoden, die das Verhalten des Objekts | ||
| + | # beeinflussen. | ||
| + | def eat(self, what_ever): | ||
| + | self._weight += 0.3 | ||
| + | </ | ||
| + | |- | ||
| + | |style=" | ||
| + | <code python> | ||
| + | """ | ||
| + | Hier folgt die main-Methode über die das Programm ausgeführt werden kann. | ||
| + | """ | ||
| + | |||
| + | if __name__ == ' | ||
| + | # Instanzieren eines Objektes über den Konstruktor. | ||
| + | # my_home ist eine Objekt-Variable, | ||
| + | # der Klasse ausführt, um das Objekt zu erzeugen | ||
| + | my_home = Address(street=' | ||
| + | number=' | ||
| + | postal_code=9999, | ||
| + | city=' | ||
| + | |||
| + | my_home.postal_code = 1001 # nutzen der setter-Methode | ||
| + | # Ausgabe der Werte über impliziten Aufruf der jeweiligen property-Methoden. | ||
| + | print(' | ||
| + | print(f' | ||
| + | f' | ||
| + | |||
| + | print(my_home) | ||
| + | </ | ||
| + | |style=" | ||
| + | <code python> | ||
| + | """ | ||
| + | Und nun ein Stück Programmcode, | ||
| + | """ | ||
| + | if __name__ == ' | ||
| + | address = Address(street=' | ||
| + | number=' | ||
| + | postal_code=9999, | ||
| + | city=' | ||
| + | milli = Human(' | ||
| + | milli.eat(' | ||
| + | print(f' | ||
| + | print(f' | ||
| + | print(f' | ||
| + | |||
| + | print(milli) | ||
| + | </ | ||
| + | |- | ||
| + | |style=" | ||
| + | Ausgabe: | ||
| + | <code > | ||
| + | Werte des Objekts address: | ||
| + | Musterstrasse 11A 1001 Musterdorf | ||
| + | Address(street=' | ||
| + | </ | ||
| + | |style=" | ||
| + | Ausgabe: | ||
| + | < | ||
| + | Name: Milli | ||
| + | Adresse: Address(street=' | ||
| + | Gewicht: 50.3 | ||
| + | Human(name=' | ||
| + | </ | ||
| + | |- | ||
| + | |||
| + | |} | ||
| + | |||
| + | |||
| + | Sie haben nun an Hand der Klasse '' | ||
| + | Ebenso könenn Sie feststellen, | ||
| + | |||
| + | Anmerkung: Sie können natürlich auch einer " | ||
| + | |||
| + | |||
| + | ---- | ||
| + | [[https:// | ||