Python Klassen zur strukturierten Datenspeicherung

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
schneitzmaster
User
Beiträge: 94
Registriert: Freitag 26. Oktober 2012, 15:35
Wohnort: Hamburg

Hallo ich verwende verschachtelte Python-Klassen zur Datenspeicherung. Leider funktioniert das noch nicht so ganz wie ich möchte. Hier ein Minimalbeispiel:

Code: Alles auswählen

class Hauptklasse:
    anzahl = 0
    class unterklasse_1:
        item = 0.0
        
Klassen_liste = [0] * 2
Klassen_liste = [Hauptklasse(),Hauptklasse()]
Klassen_liste[0].anzahl = 2
Klassen_liste[1].anzahl = 3
Klassen_liste[0].unterklasse_1.item = 3.0 
print Klassen_liste[1].unterklasse_1.item
Meine Problem/Frage ist warum ist im Listenelement Klassen_liste[1] für die unterklasse_1.item der 3.0 gesetzt. Ich habe doch noch nicht auf dieses Element und die Unterklasse zugegriffen.
ei der Hauptklasse funktioniert das ganze sprich ich bekomme 2 bzw. 3 beim Abruf von

Code: Alles auswählen

print Klassen_liste[0].anzahl
print Klassen_liste[1].anzahl
aber ebend zweimal 3.0 wenn ich

Code: Alles auswählen

print Klassen_liste[0].unterklasse_1.item
print Klassen_liste[1].unterklasse_1.item
ausführe.
Was habe ich falsch gemacht?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dein gesamter Aufbau ist extrem unglücklich.

Warum verschachtelst du Klassendefinitionen? Bist du sicher, dass du bei der Unterklasse nicht mit einer Instanz der Klasse arbeiten möchtest statt mit der Klasse selber? Ist dir der Unterschied zwischen Attributen der Klasse und Attributen einer Instanz klar?

Spontan würde ich das eher so aufbauen:

Code: Alles auswählen

    class Unterklasse(object):
        def __init__(self):
            self.item = 0.0

    class Hauptklasse(object):
        def __init__(self):
            self.anzahl = 0
            self.unterklasse_1 = Unterklasse()

    klassen = [Hauptklasse(), Hauptklasse()]
    klassen[0].anzahl = 2
    klassen[1].anzahl = 3
    klassen[0].unterklasse_1.item = 3.0
    print(klassen[1].unterklasse_1.item)
Der Konstruktor der Hauptklasse könnte auch noch anders gestaltet werden und in der Folge zu übersichtlicherem Code führen:

Code: Alles auswählen

    class Hauptklasse(object):
        def __init__(self, anzahl=0):
            self.anzahl = anzahl
            self.unterklasse_1 = Unterklasse()

    klassen = [Hauptklasse(2), Hauptklasse(3)]
schneitzmaster
User
Beiträge: 94
Registriert: Freitag 26. Oktober 2012, 15:35
Wohnort: Hamburg

Hi /me,
vielen vielen Dank für deinen Hinweis jetzt funktioniert es so wie es soll.
Ja du hast schon den richtigen Riecher gehabt. Ich habe ein minimales Verständnis von objektorientierter Programmierung. Ich fange quasi erst damit an und benutze Python nur als mittel zum Zweck.
Dennoch wüßte ich gern was dieses def __init__(self) macht?
Warum ist das notwendig denn für die Hauptklasse hat meine Programmiervariante (wenn auch wohl sehr umständlich), ja funktioniert.

Gruß
Schneitzmaster
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Funktioniert hat deine erste Lösung auch nicht, es hat nur zufällig das von dir erwartete Ergebnis geliefert. Und auch wenn du Python nur als Mittel zum Zweck benutzt, schau dir wenigstens die Grundlagen zu Klassen in Python an. Es ist ja unnütz dir hier alles zu erklären, wenn es in der Dokumentation viel besser und ausführlicher steht. Dort ist auch beschrieben, was die __init__-Methode macht.

Sebastian
Das Leben ist wie ein Tennisball.
Antworten