Problem mit der Nutzung von Classes

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
heavyCurrent
User
Beiträge: 4
Registriert: Mittwoch 6. Februar 2019, 15:59

Hallo zusammen,

ich bin hier schon länger am Mitlesen, habe jetzt aber auch mal eine konkrete Frage, für die ich nichts finden konnte - sorry wenn ich was übersehen habe

Folgendes:
Ich schreibe ein kleines Programm, das aus einem Text, welcher via tkinter eingabefeld eingegeben werden soll, bestimmte pasagen raussucht und diese dann zu einem neuen zusammensetzt.
Es geht dabei um Koordinaten von Punkten aus dem CAD, es gibt also immer einen Punktname und dazu gehörig die Koordinaten X, Y und Z
nun habe ich mir eine Class erstellt wie folgt:

Code: Alles auswählen

class Point(object):
def __init__(self, x, y, z):
	self.X = x
	self.Y = y
	self.Z = z
Nun habe ich da eine Schleife am laufen, die immer anhand eines Kriteriums einen Punkt erkennt und dann als erstes den Punktnamen und dann die X, Y und Z Koordinate raussucht. diese stehen dann auf den Variablen pointname, xcoor, ycoor und zcoor.
wenn ich nun anhand der Class das ganze speichern will macht man das ja prinzipiell mit

Code: Alles auswählen

pointname = Point(xcoor, ycoor, zcoor)
nun ist aber mein Problem, dass die "Variable" dann nicht den Punktnamen trägt sonder "pointname" heißt und die attribute X Y und Z hat.
Wie bekomme ich es hin, dass Python da nicht "pointname" nimmt, sonder immer den Inhalt von pointname also meinetwegen Punkt1?

Danke euch
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gar nicht. Denn das waere ja auch komisch, oder? Denn dann muesstest du ja Code schreiben, der alle jemals moeglichen pointnames hat. Das waere recht viel Arbeit...

Was du suchst ist ein Woerterbuch. Darin kannst du alle deine Punkte mit dem Namen als Schluessel ablegen:

points["brandenburger-tor"] = Point(1, 2, 3)

Dann noch eine Anmerkung zu deiner Klasse: wenn alles was du brauchst nur so ein simpler Datensack ist, dann solltest du stattdessen collections.namedtuple verwenden:

Code: Alles auswählen

from collections import namedtuple
Point = namedtuple("Point x y z")
Und dabei auch gleich die Namenskonvention fuer Python beachten. Attributnamen werden kleingeschrieben.
heavyCurrent
User
Beiträge: 4
Registriert: Mittwoch 6. Februar 2019, 15:59

Super vielen Dank für die schnelle Hilfe!
habe das nochmal gegoogled und mache das jetzt so:

Code: Alles auswählen

from collections import namedtuple
Point = namedtuple("Point", ["name","x","y","z"])
allerdings habe ich da glaube ich noch etwas falsche verstanden.
Weil wie kriegen ich denn es jetzt trotzdem hin, bei jeder Runde da eine neue "Variable" angelegt wird?
Ist ja wieder so dass man schreibt:

Code: Alles auswählen

Point1 = Point("PunktName", 1, 2, 3)
und die "Variable" dann Point 1 heißt und nicht Punktname.
Wie bekomme ich das denn hin?
Sorry wenn das eine reichlich dämliche Frage ist.

Edit: Das muss ja irgendwie mit dem Dictionary gehen, ich stehe aber irgendwie auf dem Schlauch wie das dann geht.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@heavyCurrent: Wie das mit einem Wörterbuch geht hat __deets__ doch schon gezeigt. Als Code-Beispiel.

Auch Variablennamen schreibt man klein. Eigentlich alles klein_mit_unterstrichen, ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Und eine 1 solltest Du auch nicht einfach so an Namen anhängen. Was soll das?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
heavyCurrent
User
Beiträge: 4
Registriert: Mittwoch 6. Februar 2019, 15:59

okay sorry ich versuch mich mal an die Konventionen zu halten

Wenn ich nun also zuerst den namedtuple anlege:

Code: Alles auswählen

from collections import namedtuple
point = namedtuple("point", ["x","y","z"])
und nun möchte ich da der Reihe nach die Punktnamen und die zugehörigen Koordinaten reinschreiben, dann mache ich:

Code: Alles auswählen

points[pointname] = point(xcoor, ycoor, zcoor)
Dabei bekomme ich dann aber immer den fehler, dass "points" nicht definiert ist.
Irgendwo hänge ich da gerade, sorry
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst points schon anlegen. Bei deinem Trivialbeispiel natuerlich einfach mit

Code: Alles auswählen

from collections import namedtuple
Point = namedtuple("Point", ["x","y","z"])

points = {}
points[pointname] = Point(xcoor, ycoor, zcoor)
Und Point ist eine Klasse, gehoert also CamelCase.
heavyCurrent
User
Beiträge: 4
Registriert: Mittwoch 6. Februar 2019, 15:59

oh man....

vielen Dank euch!
Antworten