Alle Klassenattribute von Beginn an definieren?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kalauer
User
Beiträge: 3
Registriert: Sonntag 13. August 2017, 08:38

Hallo liebes Forum,

ich habe eine Frage zu einer Designentscheidung. Ich habe eine Klasse "Wasser" definiert. Wasser kann sehr viele Eigenschaften aufweisen. Temperatur, Aggregatszustand, Färbung, Geruch und kommt es zu den Inhaltsstoffen kann es richtig unübersichtlich werden. In meinem Modul gibt es Funktionen, die als Parameter eine Instanz der Klasse Wasser übergeben bekommen wollen. Die Funktionen wissen dann damit umzugehen und der Nutzer bekommt das gewünschte Ergebnis. Nun steh ich vor folgender Wahl: Macht es Sinn, alle möglichen Attribute bereits zu Beginn festzulegen und mit None als Default zu versehen, oder sollen die Attribute erst zur Laufzeit ergänzt werden? Gefühlt wäre mir die zweite Variante lieber, das würde meine Wasser-Klasse nicht unnötig überladen. Aber man müsste dann an anderer Stelle dem Nutzer kenntlich machen, welche Attribute der Klasse zugewiesen werden können/sollten, wenn er bestimmte Funktionen ausführen möchte. Dies könnte über den Docstring der Funktion erfolgen. Spätestens bei

Code: Alles auswählen

AttributeError: 'Water' object has no attribute 'temperature'
würde man erkennen, was die Funktion erwartet.

Übrigens möchte ich bewusst hier keine Klassenmethoden sondern Funktionen haben. In der Regel soll nämlich nicht nur "Wasser" übergeben werden. Eine Möglichkeit wäre zum Beispiel die Mischung verschiedener Wässer und daraus resultierende Änderung der Zusammensetzung. Oder ein Objekt soll in das Wasser getaucht werden und der Auftrieb soll berechnet werden.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Muss Wasser zwingend eine Klasse sein? Wie wäre es mit der Repräsentation der Zustände als dict? Da sehen dynamische Änderungen, die erst nach der Erstellung erfolgen, IMHO sauberer aus.
kalauer
User
Beiträge: 3
Registriert: Sonntag 13. August 2017, 08:38

Neben den Attributen möchte ich auch noch Methoden haben, die einzig die Klasse Wasser betreffen. Ein Beispiel wäre der Druck als Funktion der Tiefe, oder Änderungen der gelösten Inhaltsstoffe als Funktion der Temperatur. Daher würde ich schon gerne bei einer Klasse bleiben.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@kalauer: was ich noch nicht ganz verstanden habe, wer füllt denn eine Wasser-Instanz mit den zusätzlichen Informationen?

Ein Klasse ist ein Beschreibung von etwas, das mehrere Instanzen haben kann. Jede Instanz ist identisch vom Aufbau, aber unterschiedlich vom Inhalt. Nachdem eine Instanz erzeugt wurde, sollte sie vollständig sein, das heißt, alle Attribute enthalten. Der Wert None kann dabei ein Platzhalter sein, für „noch nicht bekannt“.

Ich habe so ein bißchen das Gefühl, dass Du selbst noch nicht genau weißt, was diese Wasserklasse eigentlich können soll. Wenn es wirklich Inhaltsstoffe gibt, die von Instanz zu Instanz verschieden sind, bietet es sich (ähnlich wie sanfus Idee) ein Wörterbuch anzulegen, das z.b. weitere_inhaltsstoffe heißt und bei Bedarf mit unterschiedlichen Schlüsseln gefüllt werden kann.
kalauer
User
Beiträge: 3
Registriert: Sonntag 13. August 2017, 08:38

@snafu: Ja, das ist richtig. Zum gegenwärtigen Zeitpunkt weiß ich noch nicht, was Wasser alles können soll. Welche Eigenschaften Wasser prinzipiell haben kann, könnte ich aber schon zusammentragen, auch wenn ich noch keine Funktionen habe, die diese Eigenschaften benötigen könnten.

Und selbst wenn ich nur ausschließlich solche Attribute definiere, für die ich auch schon Verwendung habe, wird die Klasse glaube ich etwas unübersichtlich. Aber ein dict zu verwenden wäre ja auch eine Möglichkeit, die Klasse zu strukturieren oder?

Also ich könnte bspw. ein Attribut "physikalische_eigenschaften" und ein Attribut "chemische_inhaltsstoffe" definieren. Beidem werden dictionaries zugewiesen, die ja bereits vordefinierte Einträge mit None als Wert haben können. Dann ist die Klasse vielleicht etwas überladen, aber zumindest sauber strukturiert. Und wenn ich es richtig verstanden habe ist es weniger unsauber bei Bedarf zu diesen Dictionaries weitere Einträge zur Laufzeit hinzuzufügen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@kalauer: Ich nehme mal an, dass Du später mehrere wässrigen Proben haben wirst, deren Zusammensetzungen sich unterscheiden werden und somit, neben den Eigenschaften von Wasser selbst, weitere wie Färbungen etc. hinzugefügt werden sollen.

Dann könnte es sinnvoll sein eine Basisklasse Wasser anzulegen, welche die Eigenschaften von Wasser repräsentiert. Je nach Untersuchung kannst Du dann eine weitere Klasse Probe(Wasser) definieren, deren Instanzen dann die weiteren Eigenschaften der zu untersuchenden Proben behandeln.

Bei Klassen ist es zwar nicht erforderlich, jedoch guter Stil, alle Instanz-Attribute bei der Initialisierung anzulegen, sei es mit konkreten Inhalten oder eben mit None. Dies macht Programme besser wartbar, da an einer Stelle definiert ist, welche Attribute vorkommen. Diese werden von Klassen in Dictionaries abgelegt. Weiter ist die Implementierung von Dictionaries mit Python 3.6 optimiert worden und eine solche zentrale Definition unterstützt den Interpreter dabei. Somit ist die Definition aller Attribute vorab nun nicht mehr nur guter Stil, sondern hat tatsächlich auch optimierenden Mehrwert :wink:
Antworten