Seite 1 von 1

Objekte automatisch erzeugen

Verfasst: Sonntag 6. März 2016, 18:00
von justanotherkiddie
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?

Re: Objekte automatisch erzeugen

Verfasst: Sonntag 6. März 2016, 18:06
von __deets__
Du hast schon selbst die Loesung erwaehnt: Listen sind die dafuer richtige Datenstruktur. Dein Problem, dass du damit zu haben glaubst, verstehe ich nicht.

Re: Objekte automatisch erzeugen

Verfasst: Sonntag 6. März 2016, 18:56
von nezzcarth
@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)}

Re: Objekte automatisch erzeugen

Verfasst: Montag 7. März 2016, 08:29
von justanotherkiddie
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?

Re: Objekte automatisch erzeugen

Verfasst: Montag 7. März 2016, 10:11
von __deets__
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>)

Re: Objekte automatisch erzeugen

Verfasst: Samstag 10. Februar 2018, 12:11
von tholle
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

Re: Objekte automatisch erzeugen

Verfasst: Samstag 10. Februar 2018, 12:46
von __deets__
liste[index].attribut = wert

Re: Objekte automatisch erzeugen

Verfasst: Samstag 10. Februar 2018, 13:40
von tholle
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

Re: Objekte automatisch erzeugen

Verfasst: Samstag 10. Februar 2018, 13:46
von __deets__
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

Re: Objekte automatisch erzeugen

Verfasst: Samstag 10. Februar 2018, 13:52
von tholle
__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

Re: Objekte automatisch erzeugen

Verfasst: Samstag 10. Februar 2018, 14:27
von kbr
@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}

Re: Objekte automatisch erzeugen

Verfasst: Samstag 10. Februar 2018, 22:21
von tholle
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

Re: Objekte automatisch erzeugen

Verfasst: Samstag 10. Februar 2018, 22:42
von Sirius3
@tholle: das ist nur ein Beispiel für ein Attribut.

Re: Objekte automatisch erzeugen

Verfasst: Sonntag 11. Februar 2018, 00:22
von tholle
Danke!

Gruss, tholle