Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m320_2024:learningunits:lu01:gleichartig [2024/04/18 18:15] – angelegt - Externe Bearbeitung 127.0.0.1modul:m320_2024:learningunits:lu01:gleichartig [2025/06/23 07:45] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden msuter
Zeile 1: Zeile 1:
 ====== LU01d - Ist Klasse gleich Klasse? ====== ====== LU01d - Ist Klasse gleich Klasse? ======
- +
 Warum stellen wir uns diese Frage? Warum stellen wir uns diese Frage?
  
-Sie haben im  ([[modul:m319:learningunits:lu12:|Modul 319]]) einen ersten Einblick erhalten. +Sie haben im  ([[de:modul:m319:learningunits:lu12:|Modul 319]]) einen ersten Einblick erhalten. 
 Dabei haben Sie eine Klasse als Ansammlung vieler Attribute kennengelernt.  Dabei haben Sie eine Klasse als Ansammlung vieler Attribute kennengelernt. 
 Man nennt solche Klassen (informell) auch Datenklassen (POPO - Plain Old Python Object). Man nennt solche Klassen (informell) auch Datenklassen (POPO - Plain Old Python Object).
Zeile 12: Zeile 12:
 Eine "allgemeine" Klasse kann ein komplexeres Objekt mit verschiedenen Verhaltensmethoden enthalten. Eine "allgemeine" Klasse kann ein komplexeres Objekt mit verschiedenen Verhaltensmethoden enthalten.
  
----- +==== Beispiel: Dataklasse und Standardklasse ====
-=== Beispiel: Dataklasse und Standardklasse ===+
  
 {{:modul:m320:learningunits:lu01:theorie:lu01-abb._1.7_neu_mensch-adresse.png?500|}}\\ {{:modul:m320:learningunits:lu01:theorie:lu01-abb._1.7_neu_mensch-adresse.png?500|}}\\
-//Abb:// Beschreibung einer Person mit deren Adresse +//AbbBeschreibung einer Person mit deren Adresse //
  
  
Zeile 28: Zeile 27:
  
  
-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.+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. Dagegen wird die Person durch eine Vielzahl von Eigenschaften wie z.B.
Zeile 42: Zeile 43:
 beschrieben. Zu diesen Attributen finden sich dann auch wieder set- und get-Methoden. beschrieben. Zu diesen Attributen finden sich dann auch wieder set- und get-Methoden.
  
----- +==== Was aber bedeutet das für die Programmierung in Python? ====
- +
-Was aber bedeutet das nun für die Programmierung in Python?\\+
 Wir betrachten uns hier die beiden Klassen ''Human'' und ''Address'' sowie deren Umsetzung in Code. Für die Person werden einige wenige Attribute und Methoden stellvertretend angeschrieben. Wir betrachten uns hier die beiden Klassen ''Human'' und ''Address'' sowie deren Umsetzung in Code. Für die Person werden einige wenige Attribute und Methoden stellvertretend angeschrieben.
  
- 
----- 
  
 === Beispiel: Codierung einer Datenklasse und einer "standard" Klasse === === Beispiel: Codierung einer Datenklasse und einer "standard" Klasse ===
Zeile 72: Zeile 69:
  
     # Durch den Decorator @dataclass wird unter anderem der Konstruktor generiert.     # Durch den Decorator @dataclass wird unter anderem der Konstruktor generiert.
 +    @property
 +    def street(self):
 +        return self._street
  
 +    @street.setter
 +    def street(self, value):
 +        self._street = value
  
-""" +    @property 
-Hier folgt die main-Methode über die das Programm ausgeführt werden kann. +    def number(self): 
-"""+        return self._number
  
-if __name__ == '__main__': +    @number.setter 
-    # Instanzieren eines Objektes über den Konstruktor+    def number(selfvalue)
-    # address ist eine Objekt-Variablewährend Adress(...den Konstruktor +        self._postal_code = value 
-    # der Klasse ausführt, um das Objekt zu erzeugen + 
-    address = Address(street='Musterstrasse', +    @property 
-                      number='11A', +    def postal_code(self): 
-                      postal_code=9999+        return self._postal_code 
-                      city='Musterdorf') + 
-    # +    @postal_code.setter 
-    # Ausgabe der Werte über impliziten Aufruf der jeweiligen Methoden. +    def postal_code(selfvalue): 
-    print('Werte des Objekts address:'+        self._number value 
-    print(f'{address.street} {address.number} ' + 
-          f'{address.postal_code} {address.city}') # nutzen der get-Methoden +    @property 
-    +    def city(self): 
-    address.postal_code = 1001  # nutzen der set-Methoden +        return self._city 
-    print(f'{address.street} {address.number} ' + 
-          f'{address.postal_code} {address.city}')+    @city.setter 
 +    def city(self, value): 
 +        self._city = value
 </code> </code>
 |style="border-bottom : thin dotted; padding: 5px; vertical-align: top;" |style="border-bottom : thin dotted; padding: 5px; vertical-align: top;"
 <code Python> <code Python>
 from address import Address from address import Address
 +
  
 class Human: class Human:
Zeile 108: Zeile 114:
     # Mehr zur Bedeutung des Konstruktors folgt später.     # Mehr zur Bedeutung des Konstruktors folgt später.
     def __init__(self, name, weight, eye_color, one_address):     def __init__(self, name, weight, eye_color, one_address):
-        self._name      = name +        self._name = name 
-        self._weight    = weight+        self._weight = weight
         self._eye_color = eye_color         self._eye_color = eye_color
         # hier können ganz viele weitere Attribute stehen, die durch         # hier können ganz viele weitere Attribute stehen, die durch
         # den Konstruktor initialisiert werden.         # den Konstruktor initialisiert werden.
-        self._address = one_address #eine Referenz zu einem Address-Objekt+        self._address = one_address  # eine Referenz zu einem Address-Objekt 
 + 
 +    def __repr__(self): 
 +        return f'Human(name=\'{self.name}\', weight={self.weight}, eye_color=\'{self.eye_color}\', address={self.address}'
  
     # Attribute werden über get-Methoden gelesen.     # Attribute werden über get-Methoden gelesen.
Zeile 125: Zeile 134:
     def name(self):     def name(self):
         return self._name         return self._name
 +
 +    @property
 +    def eye_color(self):
 +        return self._eye_color
  
     @property     @property
Zeile 142: Zeile 155:
     # beeinflussen.     # beeinflussen.
     def eat(self, what_ever):     def eat(self, what_ever):
-         self._weight += 0.3+        self._weight += 0.3 
 +</code> 
 +|-  
 +|style="border-right: thin solid; border-bottom : thin dotted; padding: 5px; vertical-align: top;"|  
 +<code python> 
 +""" 
 +Hier folgt die main-Methode über die das Programm ausgeführt werden kann. 
 +"""
  
 +if __name__ == '__main__':
 +    # Instanzieren eines Objektes über den Konstruktor.
 +    # my_home ist eine Objekt-Variable, während Address(...) den Konstruktor
 +    # der Klasse ausführt, um das Objekt zu erzeugen
 +    my_home = Address(street='Musterstrasse',
 +                      number='11A',
 +                      postal_code=9999,
 +                      city='Musterdorf')
 +
 +    my_home.postal_code = 1001  # nutzen der setter-Methode
 +    # Ausgabe der Werte über impliziten Aufruf der jeweiligen property-Methoden.
 +    print('Werte des Objekts address:')
 +    print(f'{my_home.street} {my_home.number} '
 +          f'{my_home.postal_code} {my_home.city}' # nutzen der get-Methoden
 +
 +    print(my_home)  # Die Methode __repr__ wurde durch @dataclass erzeugt
 +</code>
 +|style="border-bottom : thin dotted; padding: 5px; vertical-align: top;"
 +<code python>
 """ """
 Und nun ein Stück Programmcode, um den Effekt zu testen Und nun ein Stück Programmcode, um den Effekt zu testen
 """ """
 if __name__ == '__main__': if __name__ == '__main__':
-    address = Address(street='Musterstrasse',  +    address = Address(street='Musterstrasse', 
-                      number='11A',  +                      number='11A', 
-                      postal_code=9999, +                      postal_code=9999,
                       city='Musterdorf')                       city='Musterdorf')
-    milli   = Human('Milli', 50, 'blue', address) # Initialgewicht ist 50 +    milli = Human('Milli', 50, 'blue', address)  # Initialgewicht ist 50 
-    milli.eat('chips'                           # wer isst nimmt zu+    milli.eat('chips' # wer isst nimmt zu
     print(f'Name: {milli.name}')     print(f'Name: {milli.name}')
     print(f'Adresse: {milli.address}')     print(f'Adresse: {milli.address}')
-    print(f'Gewicht: {milli.weight}'            # das Ergebnis sieht man ;-)+    print(f'Gewicht: {milli.weight}' # das Ergebnis sieht man ;-) 
 + 
 +    print(milli)  # Ruft die Methode __repr__ auf
 </code> </code>
-  
 |-  |- 
 |style="border-right: thin solid; border-bottom : thin dotted; padding: 5px; vertical-align: top;" |style="border-right: thin solid; border-bottom : thin dotted; padding: 5px; vertical-align: top;"
Zeile 164: Zeile 204:
 <code > <code >
 Werte des Objekts address: Werte des Objekts address:
-Musterstrasse 11A 9999 Musterdorf 
 Musterstrasse 11A 1001 Musterdorf Musterstrasse 11A 1001 Musterdorf
 +Address(street='Musterstrasse', number='11A', postal_code=1001, city='Musterdorf')
 </code> </code>
 |style="border-bottom : thin dotted; padding: 5px; vertical-align: top" |style="border-bottom : thin dotted; padding: 5px; vertical-align: top"
Zeile 171: Zeile 211:
 <code> <code>
 Name: Milli Name: Milli
-Adresse: Address(street='Musterstrasse', number='11A', postal_code=9999, city='Musterdorf')+Adresse: Address(street='Musterstrasse', number=9999, postal_code=9999, city='Musterdorf')
 Gewicht: 50.3 Gewicht: 50.3
 +Human(name='Milli', weight=50.3, eye_color='blue', address=Address(street='Musterstrasse', number=9999, postal_code=9999, city='Musterdorf')
 </code> </code>
- 
 |- |-
  
 |} |}
-\\ 
----- 
  
-Sie haben nun an Hand der Klasse ''Human'' den Aufbau einer Klasse mit all ihren Details gesehen. Ebenso könenn Sie feststellen, dass eine "Datenklasse" in Python mittels dem ''@dataclass'' Dekorator um ein vielfaches einfacher zu erstellen ist, da weder Konstruktor noch Methoden notwendig sind.\\ + 
-Anmerkung: Sie können natürlich auch einer "Datenklasse" eigene Methoden oder angpasste setter und getter zufügen.+Sie haben nun an Hand der Klasse ''Human'' den Aufbau einer Klasse mit all ihren Details gesehen.  
 +Ebenso könenn Sie feststellen, dass eine "Datenklasse" in Python mittels dem ''@dataclass'' Dekorator um ein vielfaches einfacher zu erstellen ist, da der Konstruktor verschiedene weitere Methoden notwendig sind. 
 + 
 +Anmerkung: Sie können natürlich auch einer "Datenklasse" eigene Methoden für ''__init__'', ''__repr__'', etc. hinzufügen.
  
  
 ---- ----
-[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) René Probst, bearbeitet durch Marcel Suter+[[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
  • modul/m320_2024/learningunits/lu01/gleichartig.1713456902.txt.gz
  • Zuletzt geändert: 2024/04/18 18:15
  • von 127.0.0.1