Instanzen eines Objekts in Abhängigkeit einer Liste

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
BastiL
User
Beiträge: 116
Registriert: Montag 7. Juli 2008, 20:22

Mittwoch 15. April 2009, 15:43

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.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 15. April 2009, 15:57

Auf dem Weg Variablen zu erzeugen ist ein ganz schlechter Stil. Wenn du Variablen durchnummerierst, dann möchtest du eine Liste oder ein Dictionary.
Das Leben ist wie ein Tennisball.
Bitzkit
User
Beiträge: 14
Registriert: Mittwoch 21. Januar 2009, 08:16

Mittwoch 15. April 2009, 16:00

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:
BastiL
User
Beiträge: 116
Registriert: Montag 7. Juli 2008, 20:22

Mittwoch 15. April 2009, 16:15

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?
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mittwoch 15. April 2009, 16:21

Ich glaube nicht, dass du dir mit dem Jonglieren von Indices hilfst ... pass lieber die Datenstruktur an.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 15. April 2009, 16:32

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.
Das Leben ist wie ein Tennisball.
BastiL
User
Beiträge: 116
Registriert: Montag 7. Juli 2008, 20:22

Mittwoch 15. April 2009, 16:45

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 15. April 2009, 17:02

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 ;-)
BastiL
User
Beiträge: 116
Registriert: Montag 7. Juli 2008, 20:22

Donnerstag 16. April 2009, 07:42

[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)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 16. April 2009, 08:38

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 ;-)
Bitzkit
User
Beiträge: 14
Registriert: Mittwoch 21. Januar 2009, 08:16

Donnerstag 16. April 2009, 09:08

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.
The Spirit
User
Beiträge: 274
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

Donnerstag 16. April 2009, 09:30

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
Antworten