Objekte automatisch erzeugen

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
justanotherkiddie
User
Beiträge: 2
Registriert: Sonntag 6. März 2016, 17:32

Hallo
Ich möchte mit einer Art Partikelsystem Berechnungen anstellen.
Dazu möchte ich für jeden Partikel ein Objekt anlegen, das Informationen, wie Ort,
Gewindigkeit, etc. enthält.
Objekte erzeugen ist zwar im Prinzip einfach, aber ich möchte einige tausend erstellen, die am besten einfach nur fortlaufend nummeriert sind,
Der Code sähe vereinfacht folgendermaßen aus:

Code: Alles auswählen

class Partikel:
      pass
for i in range(10)
      name="obj"+str(i)
      name=Partikel()
An dieser Stelle tritt das Problem auf: Python fasst name als den Namen des Objekts auf, ich möchte, dass der Wert der variable name verwendet wird. Gibt es dazu eine möglichkeit?
Ich habe es auch schon mit listen versucht, aber da lande ich irgendwann auch wieder bei dem selben problem:
Ich bin bei einer Variable und muss ein Objekt erzeugen, das als Namen den Wert der Variable besitzt.
Muss man in Python alle Objekte von Hand erzeugen?
Zuletzt geändert von Anonymous am Sonntag 6. März 2016, 18:14, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast schon selbst die Loesung erwaehnt: Listen sind die dafuer richtige Datenstruktur. Dein Problem, dass du damit zu haben glaubst, verstehe ich nicht.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

@justanotherkiddie: Wie genau sah dein Versuch mit den Listen aus?

Üblich wäre beispielsweise so etwas:

(Python 3)

Code: Alles auswählen

particles = [Particle() for _ in range(10)]
Durchnummerierte Variablen zu erstellen ist zwar theoretisch möglich, i.d.R. aber keine gute Idee. Die Objekte sollten in einem Container liegen. Listen wären hier vermutlich das beste, wenn du denn unbedingt Namen möchtest, kannst du ein Dictionary verwenden (auch wenn ich hier nummerierte Strings umständlich finde):

Code: Alles auswählen

particles = {'obj_{}'.format(i):Particle() for i in range(10)}
justanotherkiddie
User
Beiträge: 2
Registriert: Sonntag 6. März 2016, 17:32

Danke für die Hilfe.
Ich hab dazwischen mal versucht eine Liste mit den Objektnamen zu erzeugen und daraus dann die Objekte.
Also eigentlich mein Beispiel ohne die for-Schleife.
Wo wir gerade bei den for- Schleifen sind:
Der for _ in range(n) Ausdruck: Ist das die allgemeinere Form der for-Schleife?
Ich hab nochmal in der offiziellen Dokumentation nachgesehen aber so ganz schlau werde ich nicht daraus.
Bedeutet der Unterstrich, das der Ausdruck über seine eigene Liste iterieren soll?
Etwa wie ein self bei der OOP?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Huh, da geht aber ne Menge durcheinander.

Die allgemeine Form der For-Schleife ist "for <bezeichner> in <iterable>". Jeder Wert in dem Iterable wird nacheinander an den Namen <bezeichner> gebunden. Und der Unterstrich "_" ist einfach nur ein Bezeichner - sonst nichts. Du kannst den genauso wie den Namen "Pillepalle" benutzen. Er hat nur eine besondere Konvention - also *nichts* technisch anderes!!!!!!! - die sagt "ich brauche die Durchgaenge, aber mich interessiert der konkrete Wert nicht".

Und nezzcarth hat dann noch eine andere Sache gemacht - eben nicht die "allgemeine Form" der for-Schleife, sondern eine besondere - die List-Comprehension. Die basiert auf der For-Schleife, aber bettet sie ein in eine Liste: [ <ausdruck> for <bezeichner> in <iterable> ]

Und das ist einfach eine Abkuerzung fuer

Code: Alles auswählen

ergebnis = []
for <bezeichner> in <iterable>:
     ergebnis.append(<ausdruck>)
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Hallo,

an der Stelle habe ich mal wieder ein meterdickes Brett vorm Kopf.

Wenn ich Objekte, bzw. Instanzen einer Klasse in eine Liste packe, wie kann ich dann diesen Objekten Attribute uebergeben.

z. B.:

Code: Alles auswählen

list = ["bla", "blubb", "foo", "bar"]

class Someobjects():
  pass

objectslist = [Someobjects() for i in list]

Wenn ich mir an dieser Stelle den Inhalt der Liste objectlist ausgebe, sehen ich, dass Objekte im Speicher reserviert sind:

Code: Alles auswählen

objectslist
[<__main__.Someobjects object at 0x7f5817cc77f0>, <__main__.Someobjects object at 0x7f5817cc7828>, <__main__.Someobjects object at 0x7f5817cc78d0>, <__main__.Someobjects object at 0x7f5817cc7908>]
Passt soweit.

Wie kann ich nun einem dieser Objekte aus der Liste ein Attribut geben? Ich sehe die Namen der Objekte ja nicht.

Klassisch waere es ja so:

Code: Alles auswählen

objectA = Someobjects()
objectA.EinAttribut = "hallo"

print(objectA.EinAttribut)
hallo
Wie kann ich dies aber nun bei Objekten machen, die sich in Listen befinden?
Verstehe ich irgendwie nicht.

Vielleicht koennte mir mal jemand erklaeren?

Vielen Dank,
tholle
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

liste[index].attribut = wert
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Stimmt, das geht! Sieht zwar etwas komisch aus, aber es geht! - Brett ist weg. Danke!

Ist es denn auch wirklich "pythonlike" so zu programmieren?
In keinem Buch oder Howto habe ich so etwas bis jetzt gesehen.

Gruss,
tholle
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natürlich ist es da. Wenn man Dinge in Listen tut, muss man mit denen ja auch was tun können.

Allerdings ist es NICHT die richtige Vorgehensweise wenn du so etwas machst:

Code: Alles auswählen

for i in range(len(liste)):
     liste[i].a = x
Das ist uniodiomatisch. Sonder da benutzt du gleich

Code: Alles auswählen

for ding in liste:
     ding.a = x
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

__deets__ hat geschrieben:Allerdings ist es NICHT die richtige Vorgehensweise wenn du so etwas machst:

CODE: [ALLES AUSWÄHLEN] [ERWEITERN/MINIMIEREN]
for i in range(len(liste)):
     liste.a = x
GeSHi © Codebox Plus Extension



Autsch.. Tatsaechlich hatte ich es gerade so implementiert. :oops:

Vielen Dank fuer die Aufklaerung.

Gruss,
tholle
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@tholle: Wenn Du den Teichen nicht nur Namen geben, sonder diese auch über die jeweiligen Namen erreichen möchtest, dann könnte Dir eine dict-comprehension nützlich sein:

Code: Alles auswählen

class Particle:

    def __init__(self, name):
        self.name = name
        self.velocity = None
        # more attributes ...

names = [... a lot of names here ... or generic ones ...]
particles = {name: Particle(name) for name in names}
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Hi @kbr,

vielen Dank fuer den Hinweis.
Objekte in ein dict abzuglegen kann tatsaechlich Vorteile haben. Das verstehe sogar ich.

Was ich allerdings in deinem Beispiel nicht so ganz verstehe, ist diese Zeile:

self.velocity = None

Ist .velocity etwas Pythontypisches oder hier einfach nur ein Beispiel fuer ein moegliches Attribut?

thx und Gruss,
tholle
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@tholle: das ist nur ein Beispiel für ein Attribut.
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Danke!

Gruss, tholle
Antworten