Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |||
modul:m323:learningunits:lu02:byreferenceinclasses [2024/08/28 09:11] – kmaurizi | modul:m323:learningunits:lu02:byreferenceinclasses [2024/08/28 09:42] (aktuell) – 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 '' |
</ | </ | ||
+ |