Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m323:learningunits:lu02:byreferenceinclasses [2024/08/28 09:11] – kmaurizi | modul:m323:learningunits:lu02:byreferenceinclasses [2026/08/25 09:14] (aktuell) – Korrektur mutable Defaults (Code warf ValueError) + Animation eingebunden admin | ||
|---|---|---|---|
| Zeile 4: | Zeile 4: | ||
| In Python werden Objekte, einschließlich Dataclasses, | In Python werden Objekte, einschließlich Dataclasses, | ||
| + | |||
| + | ===== Animation: Objekte, frozen und Standardwerte ===== | ||
| + | |||
| + | Die Animation zeigt drei Abläufe Schritt für Schritt. Tab 1 und 2 gehören zu den Beispielen weiter unten; Tab 3 zeigt, was bei einem veränderbaren Standardwert passiert – und damit den Grund, weshalb Dataclasses solche Standardwerte gar nicht erst zulassen. | ||
| + | |||
| + | {{url> | ||
| ===== Dataclasses ===== | ===== Dataclasses ===== | ||
| Zeile 20: | Zeile 26: | ||
| </ | </ | ||
| - | Diese Dataclass Person hat zwei Attribute: '' | + | Diese Dataclass |
| ===== By Reference bei Dataclasses ===== | ===== By Reference bei Dataclasses ===== | ||
| Zeile 42: | Zeile 48: | ||
| person.age += 1 | person.age += 1 | ||
| - | if name == 'main': | + | if __name__ |
| p = Person(name=' | p = Person(name=' | ||
| - | print(f' | + | print(f' |
| birthday(p) | birthday(p) | ||
| - | print(f' | + | print(f' |
| </ | </ | ||
| - | In diesem Beispiel wird die Instanz der Dataclass Person an die Funktion '' | + | In diesem Beispiel wird die Instanz der Dataclass |
| ===== Mutable und Immutable Attribute in Dataclasses ===== | ===== Mutable und Immutable Attribute in Dataclasses ===== | ||
| Zeile 55: | Zeile 61: | ||
| Python-Dataclasses können sowohl mutable als auch immutable Attribute enthalten. Unabhängig davon, ob die Attribute mutable oder immutable sind, wird die Dataclass selbst immer '' | Python-Dataclasses können sowohl mutable als auch immutable Attribute enthalten. Unabhängig davon, ob die Attribute mutable oder immutable sind, wird die Dataclass selbst immer '' | ||
| - | ==== Beispiel: | + | ==== Mutable |
| + | |||
| + | Es liegt nahe, einem Listen-Attribut einfach eine leere Liste als Standardwert zu geben: | ||
| <code python> | <code python> | ||
| - | from dataclasses import dataclass, field | + | from dataclasses import dataclass |
| - | from typing import List | + | |
| @dataclass | @dataclass | ||
| class Student: | class Student: | ||
| name: str | name: str | ||
| - | grades: | + | grades: |
| + | </ | ||
| - | def add_grade(student: Student, grade: int): | + | Dieser Code lässt sich **nicht ausführen**. Bereits beim Definieren der Klasse bricht Python ab: |
| - | """ | + | |
| - | Adds a grade to the student' | + | |
| - | """ | + | |
| - | student.grades.append(grade) | + | |
| - | if name == ' | + | < |
| - | s = Student(name=' | + | ValueError: mutable default < |
| - | print(f' | + | |
| - | add_grade(s, | + | |
| - | print(f'Nach der Änderung: {s.grades}') # Output: Nach der Änderung: [90] | + | |
| </ | </ | ||
| - | In diesem Beispiel | + | Der Grund: Ein Standardwert |
| + | |||
| + | <WRAP center round important 90%> | ||
| + | **Bei normalen Funktionen greift dieser Schutz nicht!** Dort ist derselbe Fehler erlaubt – und still: | ||
| + | |||
| + | <code python> | ||
| + | def add_grade(grade, | ||
| + | grades.append(grade) | ||
| + | return grades | ||
| + | |||
| + | print(add_grade(90)) | ||
| + | print(add_grade(80)) | ||
| + | </ | ||
| + | |||
| + | Die Liste im Standardwert überlebt den Funktionsaufruf, | ||
| + | </ | ||
| + | |||
| + | ==== Lösung: Verwendung von `field(default_factory=list)` ==== | ||
| + | |||
| + | Für mutable Standardwerte verwendet man in Dataclasses die Funktion '' | ||
| + | |||
| + | <code python> | ||
| + | from dataclasses import dataclass, field | ||
| + | |||
| + | @dataclass | ||
| + | class Student: | ||
| + | name: str | ||
| + | | ||
| + | |||
| + | if __name__ == ' | ||
| + | student1 = Student(name=' | ||
| + | student2 = Student(name=' | ||
| + | |||
| + | student1.grades.append(90) | ||
| + | print(student2.grades) | ||
| + | </ | ||
| ===== Immutable Dataclasses ===== | ===== Immutable Dataclasses ===== | ||
| Zeile 96: | Zeile 132: | ||
| </ | </ | ||
| - | In diesem Fall ist die Dataclass ImmutablePerson unveränderlich, | + | In diesem Fall ist die Dataclass |
| + | |||
| + | < | ||
| + | FrozenInstanceError: | ||
| + | </ | ||
| ==== Beispiel: Anwendung einer frozen Dataclass ==== | ==== Beispiel: Anwendung einer frozen Dataclass ==== | ||
| Zeile 114: | Zeile 154: | ||
| return Person(name=person.name, | return Person(name=person.name, | ||
| - | if name == 'main': | + | if __name__ |
| p = Person(name=' | p = Person(name=' | ||
| - | print(f' | ||
| new_p = birthday(p) | new_p = birthday(p) | ||
| - | print(f' | + | print(f' |
| - | print(f' | + | print(f' |
| </ | </ | ||
| Zeile 132: | Zeile 171: | ||
| * **Vorhersehbarkeit: | * **Vorhersehbarkeit: | ||
| * **Immutable Data:** Die Verwendung von immutable Datenstrukturen verhindert unbeabsichtigte Modifikationen und erleichtert die Parallelisierung von Programmen. | * **Immutable Data:** Die Verwendung von immutable Datenstrukturen verhindert unbeabsichtigte Modifikationen und erleichtert die Parallelisierung von Programmen. | ||
| + | |||
| Dieses Vorgehen ist besonders nützlich in Szenarien, in denen Datenintegrität und Vorhersagbarkeit des Programmverhaltens von hoher Bedeutung sind. | Dieses Vorgehen ist besonders nützlich in Szenarien, in denen Datenintegrität und Vorhersagbarkeit des Programmverhaltens von hoher Bedeutung sind. | ||
| ===== Zusammenfassung ===== | ===== Zusammenfassung ===== | ||
| - | In Python werden Objekte, einschließlich Dataclasses, | + | In Python werden Objekte, einschließlich Dataclasses, |
| <WRAP center round tip 60%> | <WRAP center round tip 60%> | ||
| - | Tipp: Wenn Sie mutable Attribute in einer Dataclass verwenden, sollten Sie sorgfältig überlegen, ob die direkte Veränderung dieser Attribute innerhalb von Funktionen in Ihrem Programmdesign erwünscht ist. Verwenden Sie '' | + | Tipp: Wenn Sie mutable Attribute in einer Dataclass verwenden, sollten Sie sorgfältig überlegen, ob die direkte Veränderung dieser Attribute innerhalb von Funktionen in Ihrem Programmdesign erwünscht ist. Verwenden Sie '' |
| </ | </ | ||
| + | |||
| + | ---- | ||
| + | {{tag> | ||
| + | [[https:// | ||
| + | |||