Klassenstrukturierung

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
erleuchteter_Narr
User
Beiträge: 3
Registriert: Mittwoch 1. Juni 2011, 19:22

Hallo,
ich bin relativ neu in der OOP und Python. Momentan bin ich dabei einen einfachen Solver für Finite Elemente zu Programmieren und würde das gerne OO tun.
Ich möchte für jedes Finite Element, ein Objekt erstellen.
Nun zur eigentlichen Frage:
Ich möchte das ganze erweiterbar halten und deswegen für jede Raumrichtung eine eigenen Aufruf zum definiren eines Elementes machen. Ist das Element nur eindimensional, ein Aufruf , für 2 zwei e.t.c
Jetzt bin ich bisher der Überzeugung, dass es das Beste wäre eine Klasse in der Klasse zu erzeugen, so das ich für jeden Aufruf ein Object erzeuge welches die Daten und Funktionen zu einer Richtung enthalten.

Habe etwas zu nested Classes gefunden, dies scheint aber für Python eher ungewöhnlich. Wie würde man soetwas umsetzen?
BlackJack

@erleuchteter_Narr: ”Nested classes” sind in Python eher ungewöhnlich weil es sie eigentlich nicht gibt. Jedenfalls nicht in dem Sinne wie es sie zum Beispiel in Java gibt, wo ein Exemplar einer inneren Klasse Zugriff auf die Attribute der kapselnden Klasse hat sofern die innere Klasse nicht statisch deklariert ist. In Python hätte man also einfach nur Klassen die Attribute von anderen Klassen wären, aber sonst keine weiteren besonderen Eigenschaften hätten. Allerdings sind diese Klassen trotzdem dem Modul zugeordnet in dem sie definiert wurden, ohne dort unter dem Namen erreichbar zu sein — damit kann man sie zum Beispiel nicht `pickle`\n.

Ich sehe aber auch nicht wo Du jetzt verschachtelte Klassen brauchst? Das klingt für mich einfach nach Komposition oder Aggregation.
erleuchteter_Narr
User
Beiträge: 3
Registriert: Mittwoch 1. Juni 2011, 19:22

Danke für die schnelle Antwort.
Tut mir Leid das ich nicht Firm im Fachjargon bin, ist nicht mein Fachgebiet. Bevor ich also etwas falsch verstehe:

Kompositon ist die: hat ein Beziehung
Aggregation die : enthält Beziehung

Hoffe das stimmt so.

Funktionieren würde das so schon, aber ich ich finde es nicht sauber, wenn ein anderes Object oder Quellcodeschnipsel eine Instanz eine Richtung erzeugen kann. Macht ja irgenwie keinen Sinn.
Hoffe ich bin nicht total durcheinander.
BlackJack

@erleuchteter_Narr: Vielleicht solltest Du etwas konkreter werden was Du da überhaupt modellieren möchtest. Wenn das unsauber ist, habe ich mir wohl etwas anderes vorgestellt. Ich dachte halt man hat ein Objekt was grundsätzlich das ”Problem” modelliert und für jede ”Richtung” ein Unterobjekt enthält.

Ich wage aber mal zu behaupten das verschachtelte Klassen in Python keine Lösung sein können, da sie nicht wirklich etwas lösen. Sie sind nichts besonderes, sondern einfach nur Klassenobjekte als Attribute auf anderen Klassenobjekten, die mindestens den Nachteil mitbringen, dass man sie nicht `pickle`\n kann. Und sie sind in Python ziemlich ungewöhnlich.
erleuchteter_Narr
User
Beiträge: 3
Registriert: Mittwoch 1. Juni 2011, 19:22

Danke für deine Mühen.

ch glaub ich habe hier eine falsche Vorstellung von irgend etwas.
Ich möchte ein Elelment erzeugen, in welchen Werkstoffdaten, Geometrieen, Näherungsfunktionen e.t.c hinterlegt werden sollen. Nun möchte ich das ganze für jede Dimension modelieren wenn nötig, aber wenn nur eine einzelne erforderlich ist, das System reduzieren.
Zu diesem Zweck, möchte ich das eine art „Superobjekt“ erstellen, in welchen alles gebündelt wird. Dieses Object, soll neben nicht richtungsabhänhingen Attributen auch für jede erforderliche Richtung eine eigenes Unterobjekt erzeugen, in dem die jeweiligen Richtungsabhängigkeiten hinterlegt werden. So weit ist das mit Komposition und Aggregation machbar.
Allerdings, hätte ich gerne die Eigenschaft, dass NUR ein „Superobjekt” sich selbst untergeordnete „Richtungen“ erstellen kann. Eine Richtung ohne Element macht keinen Sinn, und dies möchte ich in der Programierung berücksichtigen.
Bisher war ich der Annahme das dies verschachtelte Klassen sind.
BlackJack

@erleuchteter_Narr: Etwas erzwingen zu wollen ist in der Regel kein ”pythonischer” Stil. Wenn es nur Sinn macht Richtungsobjekte innerhalb des ”Superobjekts” zu erstellen, dann erstelle sie halt nur dort. Das man sie nicht selbst/ausserhalb erstellen sollte, kannst Du in der Dokumentation schreiben und vielleicht diese Klassen durch einen führenden Unterstrich im Namen als Implementierungsdetail kennzeichnen.

In Java beispielsweise könnte man dafür tatsächlich als ``private`` deklarierte innere Klassen verwenden, aber diese Art des erzwungenen Zugriffsschutzes gibt es in Python nicht. Und das ist beabsichtigt.
Antworten