Danke, danke ! Tut zwar weh
, aber hilft bestimmt !
Dann mal los, vielleicht von hinne nach vonne:
Sirius3 hat geschrieben:@mephisto-online: Dein erster Fehler ist, daß Du globale Variablen verwenden willst. »dataSets« ist eine Variable, die unnötig ist. Willst Du wissen, wieviele Elemente »dataList« enthält, kannst Du das einfach über »len(dataList)« herausfinden.
Stimmt, ist einfacher !
Sirius3 hat geschrieben:
»dataList« hingegen wird ja in irgendeinem Kontext gebraucht, zum Beispiel im Daten zu speichern, die im Fenster »DataPy« dargestellt werden. Dann sollte »dataList« auch in Attribut von »DataPy« sein.
Das Hauptfenster soll die Benutzeroberflache sein, mit Buttons und der Datensatzliste, wo man dann jeweils einen Basis-Satz und einen Referenz-Satz auswählen kann und natürlich auch die Aktionen auslösen, die dann irgendwas mit denen machen. Die sollen dann aber jeweils separat in einem anderen Fenster/Widget erscheinen. Dafür möchte ich mehrere Module/Files machen (Calc, Graphics, File_IO, Db_IO). Ok, die Daten, BasisSet-Nr. und RefSet-Nr. kann ich natürlich dann parametrisch an andere Kontexte übergeben.
Sirius3 hat geschrieben:
Die Funktion »newDataSet« macht auch seltsame Dinge. Willst Du tatsächlich das Modul »basicdataset« in die Liste einfügen?
Ja, das ist Quatsch so !
Sirius3 hat geschrieben:
Du meintest wahrscheinlich »basicdataset.DataSet()«. Dann ist es aber unüblich ein Objekt zu einer Liste hinzuzufügen, ohne seine Init-Parameter setzten zu können. Das würde ja bedeuten, daß man nachträglich das Objekt nochmals ändern muß, die Liste also unfertige Objekte enthält. Eine andere Methode, die auf die Liste zugreift, könnte dadurch verwirrt werden.
Mein Plan war, der DataSet-Klasse noch eine Funktion (z.B. change_Data(...)) zu verpassen, in der ich die __init__-Methode mit Parametern aufrufen kann, um die Attribute zu ändern. Die Liste soll also tatsächlich modifizierbare Objekte haben.
Sirius3 hat geschrieben:
Bei Deinem »DataSet«-Objekt sind die zweifachen Unterstriche mindestens einer zu viel. Wahrscheinlich sogar zwei, weil im Normalfall ein Data-Set Daten zur Verfügung stellt, seine Attribute damit öffentlich sind.
Ich hatte gelernt, dass die zwei Unterstriche Attribute privat machen. So hatte ich mir das ja auch vorgestellt. Änderungen halt dann mit der "change_data"-Funktion
BlackJack hat geschrieben:Bei ``dataSets += 1`` versuchst Du den *lokalen* Namen `dataSets` an den alten Wert der an diesen Namen gebunden ist plus 1 zu binden, nur das an den *lokalen* Namen vorher noch kein Wert gebunden wurde den man erhöhen könnte.
Genau das verstehe ich nicht. Mit dataSets=0 am Anfang wollte ich den Namen global erzeugen/binden und auf den wollte ich dann in newDataSet() zugreifen. Das ist eigentlich die wesenliche Frage, die ich jetzt hier hatte.
BlackJack hat geschrieben:
Immer wenn der Compiler in einer Funktion eine Zuweisung an einen Namen sieht, dann ist das ein lokaler Name. Namen denen nichts zugewiesen wird, müssen „in der Umgebung” der Funktion existieren, spätestens wenn die Funktion ausgeführt wird. In diesem Fall ist „die Umgebung” das Modul.
Den Namen gibt es doch global mit dem Wert 0, Wie kann man denn lokal auf eine existierende globale Variabe zugreifen ? Globale Variabe lokal erzeugen geht mit global blabla, das weiss ich. Aber dataSets gibt es ja schon global.
BlackJack hat geschrieben:
*die* kann man jederzeit mit `len()` abfragen.
Ja, *die* braucht man nicht.
BlackJack hat geschrieben:
Mein Gefühl sagt mir das Du `actual*` durch `current*` ersetzen möchtest. Und die beiden sehen mir weder von der Schreibweise des Namens noch von der vermuteten Semantik nach Namen aus die auf Modulebene existieren sollten.
Da weiss ich jetzt nicht, was Du meinst
BlackJack hat geschrieben:
Eigentlich solltest Du einen ganz anderen Fehler sehen, denn ``basicdataset.py`` wird so wie es dort steht vom Compiler nicht ohne Syntaxfehlermeldung übersetzt.
PyCharm meckert nicht und das Programm läuft bis hier auch.
BlackJack hat geschrieben:
Bei den Attributen solltest Du aus den zwei führenden Unterstrichen jeweils einen machen. Das ist die in Python übliche Konvention um dem Leser mitzuteilen, dass ein Attribut nicht zur öffentlichen API gehört.
Ich hatte es jetzt halt so gelernt, dass man mir den zwei Unterstrichen private Attribute definiert.
Grüße
mephisto