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 [2025/11/17 13:37] (aktuell) – alte Version wiederhergestellt (2025/11/13 10:31) kmaurizi | ||
|---|---|---|---|
| Zeile 20: | Zeile 20: | ||
| </ | </ | ||
| - | Diese Dataclass Person hat zwei Attribute: '' | + | Diese Dataclass |
| ===== By Reference bei Dataclasses ===== | ===== By Reference bei Dataclasses ===== | ||
| Zeile 42: | Zeile 42: | ||
| 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 55: | ||
| 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 | + | ==== Problem: Mutable |
| + | |||
| + | Ein häufiges Problem bei der Verwendung von mutable Objekten (wie Listen) | ||
| + | |||
| + | <code python> | ||
| + | from dataclasses import dataclass | ||
| + | |||
| + | @dataclass | ||
| + | class Student: | ||
| + | name: str | ||
| + | grades: list = [] | ||
| + | |||
| + | # Problem: Alle Instanzen teilen sich dieselbe Liste. | ||
| + | if __name__ | ||
| + | student1 | ||
| + | student2 = Student(name=' | ||
| + | |||
| + | student1.grades.append(90) | ||
| + | print(student2.grades) | ||
| + | </ | ||
| + | |||
| + | In diesem Beispiel teilen sich alle Instanzen der Dataclass '' | ||
| + | |||
| + | ==== Lösung: Verwendung von `field(default_factory=list)` ==== | ||
| + | |||
| + | Um dieses Problem zu lösen, verwendet man in Dataclasses für mutable Standardwerte wie Listen die Funktion `field` mit dem Parameter `default_factory`. Dadurch wird sichergestellt, | ||
| <code python> | <code python> | ||
| from dataclasses import dataclass, field | from dataclasses import dataclass, field | ||
| - | from typing import List | ||
| @dataclass | @dataclass | ||
| class Student: | class Student: | ||
| name: str | name: str | ||
| - | grades: | + | grades: |
| - | def add_grade(student: | + | if __name__ == ' |
| - | | + | |
| - | Adds a grade to the student's grade list. | + | |
| - | | + | |
| - | student.grades.append(grade) | + | |
| - | if name == ' | + | student1.grades.append(90) |
| - | s = Student(name=' | + | print(student2.grades) |
| - | print(f' | + | |
| - | add_grade(s, 90) | + | |
| - | print(f'Nach der Änderung: {s.grades}') # Output: Nach der Änderung: [90] | + | |
| </ | </ | ||
| - | In diesem Beispiel wird die Liste grades | + | Durch die Verwendung von `field(default_factory=list)` wird sichergestellt, |
| ===== Immutable Dataclasses ===== | ===== Immutable Dataclasses ===== | ||
| Zeile 96: | Zeile 115: | ||
| </ | </ | ||
| - | In diesem Fall ist die Dataclass ImmutablePerson unveränderlich, | + | In diesem Fall ist die Dataclass |
| ==== Beispiel: Anwendung einer frozen Dataclass ==== | ==== Beispiel: Anwendung einer frozen Dataclass ==== | ||
| Zeile 114: | Zeile 133: | ||
| return Person(name=person.name, | return Person(name=person.name, | ||
| - | if name == 'main': | + | if __name__ |
| p = Person(name=' | p = Person(name=' | ||
| - | print(f' | + | print(f' |
| new_p = birthday(p) | new_p = birthday(p) | ||
| - | print(f' | + | print(f' |
| - | print(f' | + | print(f' |
| </ | </ | ||
| Zeile 132: | Zeile 151: | ||
| * **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:// | ||
| + | |||