Seite 1 von 1

Instanzen eines Objekts in Abhängigkeit einer Liste

Verfasst: Mittwoch 15. April 2009, 15:43
von BastiL
Hallo zusammen,

ich loope über eine Liste mit Strings

Code: Alles auswählen

for i in liste:
    print i
    neueinstanz = eine.neueinstanz()
Ich möchte also für jeden String der Liste eine neue Instanz eines Objekts erzeugen. Nun muss sich der Name des Objekts ändern, weil ich sonst ja die jeweils vorige Instanz überschreibe, was ich aber nicht möchte. Dazu müsste man jetzt irgendwie eine Zählvariable in den Variablennamen "neueinstanz" bekommen? Oder denke ich zu komplizert?

Danke.

Verfasst: Mittwoch 15. April 2009, 15:57
von EyDu
Auf dem Weg Variablen zu erzeugen ist ein ganz schlechter Stil. Wenn du Variablen durchnummerierst, dann möchtest du eine Liste oder ein Dictionary.

Verfasst: Mittwoch 15. April 2009, 16:00
von Bitzkit
was hast du genau vor ?

du könntest für jedes Element ne neue Instanz machen und das in einer list oder dict speichern.

Beispiel Liste:

Code: Alles auswählen

instanzen = []
for element in liste:
    print element
    instanzen.append(NeueInstanz())
wenn du nen Zähler brauchst benutz enumerate, aber bitte nicht um irgendwelche variablen zu generieren!

edit: war zu langsam :oops:

Verfasst: Mittwoch 15. April 2009, 16:15
von BastiL
Bitzkit hat geschrieben:was hast du genau vor ?
Jeder String repräsentiert eine Datenstruktur, für die eine Instanz eines Objekts benötigt wird.
du könntest für jedes Element ne neue Instanz machen und das in einer list oder dict speichern.
Ok das habe ich im Prinzip gesucht. Allerdings muss ich rückschließen können, welche Instanz zu welchem String in der anderen Liste gehört. Das müsste aber über die Position in der Liste gelingen, oder?

Verfasst: Mittwoch 15. April 2009, 16:21
von cofi
Ich glaube nicht, dass du dir mit dem Jonglieren von Indices hilfst ... pass lieber die Datenstruktur an.

Verfasst: Mittwoch 15. April 2009, 16:32
von EyDu
Dann nimm ein Dictionary und übergebe den Namen mit beim Erzeugen. Den speicherst du dann als Attribut mit ab:

Code: Alles auswählen

dict((name, Spam(parameter, hier, name)) for name in liste)
Oder besser: erzähl uns genauer was du vor hast und etwas Kontext dazu. Es gibt mit großer Wahrscheinlichkeit eine schönere Lösung.

Verfasst: Mittwoch 15. April 2009, 16:45
von BastiL
EyDu hat geschrieben:Oder besser: erzähl uns genauer was du vor hast und etwas Kontext dazu. Es gibt mit großer Wahrscheinlichkeit eine schönere Lösung.
Hmm also ich habe eine Liste mit Strings. Jeder String repräsentiert eine Datei im aktuellen Verzeichnis, in der das Programm ausgeführt wird. Jede dieser Dateien soll nun geparst und auf bestimmte Eigenschaften hin untersucht werden - dazu habe ich eine Klasse geschrieben, die die nötigen Attribute und Methoden mitbringt.
Nun möchte ich eben für jeden Listeneintrag:
- eine neue Instanz dieser Klasse erzeugen
- bestimmte Methoden der Klasse aufrufen
- bestimmte Attribute jederzeit abfragen können

Je nachdem was die Methodenaufrufe bringen muss ich anschließend den Namen der Datei verfügbar haben - ich muss wissen welche Attribute (gespeichert in der Instanz der Klasse) welche Datei (gespeichert in der ursprünglichen Liste) hat.
Wo ich das hier schreibe komt mir gerade die Idee, den Dateinamen als Attribut in der Klasse mitzusichern, dann würde mir eine einfache Liste genügen.

So ich denke jetzt habt ihr mal etwas mehr Info - falls noch etwas unkla rist einfach fragen.

Verfasst: Mittwoch 15. April 2009, 17:02
von Hyperion
BastiL hat geschrieben: Wo ich das hier schreibe komt mir gerade die Idee, den Dateinamen als Attribut in der Klasse mitzusichern, dann würde mir eine einfache Liste genügen.
Sicher. Allerdings müßtest Du dann immer alle Instanzen anfassen, wenn Du eine bestimmte in Abhängigkeit vom Dateinamen suchst. Da wäre dann ein dict geeigneter.

Da wir nicht wissen, was "jederzeit" bedeutet ist das natürlich spekulativ ;-)

Verfasst: Donnerstag 16. April 2009, 07:42
von BastiL
[quote="Hyperion"
Sicher. Allerdings müßtest Du dann immer alle Instanzen anfassen, wenn Du eine bestimmte in Abhängigkeit vom Dateinamen suchst. Da wäre dann ein dict geeigneter.

Da wir nicht wissen, was "jederzeit" bedeutet ist das natürlich spekulativ ;-)[/quote]

Ich weiss selbst noch nicht genau, wie oft das vorkommen wird. Generell wird es aber nötig sein und ich werde nicht SO viele Instanzen erzeugen müssen (typischerweise vielleicht etwa 20)

Verfasst: Donnerstag 16. April 2009, 08:38
von Hyperion
Dennoch bleibt die zentrale Frage, ob man das sequentiell abarbeiten kann (wobei man dann ggf. sogar ohne Klassen auskommen würde), oder ob der Zugriff wahlweise erfolgen soll. Bei letzterem denke ich schon, dass eiin dict da sehr geeignet ist.

Aber so groß dürfte der Coding-Aufwand dann ja auch nicht sein, das von einer Liste in ein dict bzw anders herum zu transformieren, wenn man sich dann sicher ist, was man wirklich braucht ;-)

Verfasst: Donnerstag 16. April 2009, 09:08
von Bitzkit
Am Besten machst nen dict. Du sagst ja selbst, dass du teilweise nur ein bestimmtes Objekt willst.

Code: Alles auswählen

#dict mit deinen Dateien als Key und die Datenstruktur als Value
# z.B. {'test.txt': Instanz der Datenstruktur,}
datenstrukturen = {}
for datei in liste:
    print datei
    datenstrukturen[datei] = Datenstruktur(datei)
so kannste die Datenstruktur z.B. auch erst laden wenn du sie wirklich brauchst

Code: Alles auswählen

datenstruktur[datei].load()
datenstruktur.was_auch_immer()
Beschäftige mich auch noch nicht so lange mit python und weiss nicht 100% was du da machst, aber vielleicht hilfts ja weiter :-)

wenn natürlich sicher sequentiell alle durcharbeitest, kannst ne list nehmen.

Verfasst: Donnerstag 16. April 2009, 09:30
von The Spirit
kann selber nur sagen, das ich das auch schon des öfteren gebraucht hätte (meiner meinung nach) aber damit immer böse auf die nase gefallen bin.
hab dann entweder mehrdimensionale listen genommen oder gleich dictionaries, wobei ich meist dictionaries bevorzugt habe