Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
modul:m323:learningunits:lu02:byreferenceinclasses [2024/08/28 09:02] – angelegt kmaurizi | modul:m323:learningunits:lu02:byreferenceinclasses [2024/08/28 09:42] (aktuell) – kmaurizi | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== |
===== Einführung ===== | ===== Einführung ===== | ||
Zeile 13: | Zeile 13: | ||
<code python> | <code python> | ||
from dataclasses import dataclass | from dataclasses import dataclass | ||
+ | |||
@dataclass | @dataclass | ||
class Person: | class Person: | ||
- | name: str | + | |
- | age: int | + | age: int |
</ | </ | ||
- | Diese Dataclass Person hat zwei Attribute: name und age. | + | Diese Dataclass |
===== By Reference bei Dataclasses ===== | ===== By Reference bei Dataclasses ===== | ||
Zeile 29: | Zeile 30: | ||
<code python> | <code python> | ||
from dataclasses import dataclass | from dataclasses import dataclass | ||
+ | |||
@dataclass | @dataclass | ||
class Person: | class Person: | ||
- | name: str | + | |
- | age: int | + | age: int |
def birthday(person: | def birthday(person: | ||
- | """ | + | |
- | Increments the age of the person by 1. | + | Increments the age of the person by 1. |
- | """ | + | """ |
- | 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 birthday übergeben. Da Objekte '' | + | In diesem Beispiel wird die Instanz der Dataclass |
===== Mutable und Immutable Attribute in Dataclasses ===== | ===== Mutable und Immutable Attribute in Dataclasses ===== | ||
Zeile 53: | 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 | + | |
- | grades: | + | grades: |
- | def add_grade(student: Student, grade: int): | + | if __name__ == ' |
- | """ | + | student1 = Student(name=' |
- | Adds a grade to the student' | + | |
- | """ | + | |
- | 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, dass jede Instanz von '' |
===== Immutable Dataclasses ===== | ===== Immutable Dataclasses ===== | ||
- | Wenn Sie möchten, dass eine Dataclass unveränderlich ist, können Sie sie durch Setzen des frozen-Parameters in @dataclass unveränderlich machen. In einer gefrorenen (frozen) Dataclass sind alle Attribute unveränderlich, | + | Wenn Sie möchten, dass eine Dataclass unveränderlich ist, können Sie sie durch Setzen des '' |
==== Beispiel: Immutable Dataclass ==== | ==== Beispiel: Immutable Dataclass ==== | ||
Zeile 86: | Zeile 108: | ||
<code python> | <code python> | ||
from dataclasses import dataclass | from dataclasses import dataclass | ||
+ | |||
@dataclass(frozen=True) | @dataclass(frozen=True) | ||
class ImmutablePerson: | class ImmutablePerson: | ||
- | name: str | + | |
- | age: int | + | age: int |
</ | </ | ||
- | In diesem Fall ist die Dataclass ImmutablePerson unveränderlich, | + | In diesem Fall ist die Dataclass |
+ | |||
+ | ==== Beispiel: Anwendung einer frozen Dataclass ==== | ||
+ | |||
+ | <code python> | ||
+ | from dataclasses import dataclass | ||
+ | |||
+ | @dataclass(frozen=True) | ||
+ | class Person: | ||
+ | name: str | ||
+ | age: int | ||
+ | |||
+ | def birthday(person: | ||
+ | """ | ||
+ | Returns a new Person instance with the age incremented by 1. | ||
+ | """ | ||
+ | return Person(name=person.name, | ||
+ | |||
+ | if __name__ == ' | ||
+ | p = Person(name=' | ||
+ | print(f' | ||
+ | new_p = birthday(p) | ||
+ | print(f' | ||
+ | print(f' | ||
+ | </ | ||
+ | |||
+ | === Erläuterung: | ||
+ | |||
+ | Die Dataclass '' | ||
+ | Die Funktion '' | ||
+ | Das Originalobjekt '' | ||
+ | |||
+ | === Vorteile: === | ||
+ | * **Keine Seiteneffekte: | ||
+ | * **Vorhersehbarkeit: | ||
+ | * **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. | ||
===== 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 '' |
</ | </ | ||
+ |