Objektattribute über eine Liste afragen

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
halux
User
Beiträge: 11
Registriert: Samstag 28. März 2009, 17:06
Wohnort: Liesten

Hallo,

ich habe Objekte mit dem Attribut get_gewicht() in einer Liste mit
liste.append(objekt) gespeichert.

wie kann ich nun, in einer Abfrage, bei allen in der Liste gespeicherten
Objekten dieses Objektattribut abfragen ( ausgeben ) lassen

Danke halux
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

for thingy in liste:
    print thingy.get_gewicht()
Allerdings braucht man in Python keine trivialen Getter/Setter -> greif direkt auf das gewicht zu.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Code: Alles auswählen

from operator import methodcaller
map(methodcaller('get_gewicht'), liste)
Wenn man die Ergebnisse verarbeitet und keine Liste braucht bietet sich imap aus dem itertools Modul an.

Du solltest allerdings direkt auf dass Gewicht zugreifen oder sollte wirklich ein getter(/setter/deleter) benötigt sein, ein property benutzen.
Zuletzt geändert von DasIch am Samstag 28. März 2009, 20:53, insgesamt 1-mal geändert.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

DasIch hat geschrieben:

Code: Alles auswählen

from operator import attrcaller
map(attrcaller('get_gewicht'), liste)
Wenn man die Ergebnisse verarbeitet und keine Liste braucht bietet sich imap aus dem itertools Modul an.

Du solltest allerdings direkt auf dass Gewicht zugreifen oder sollte wirklich ein getter(/setter/deleter) benötigt sein, ein property benutzen.
Eine for Schleife reicht da total und ist viel lesbarer.
Evtl. noch eine List Comprehension:

Code: Alles auswählen

[foo.get_gewicht() for foo in liste]
oder eine Generator Expression:

Code: Alles auswählen

(foo.get_gewicht() for foo in liste)
PS: Fuer die Code-Golfer hier im Forum, die LC bzw. GenExp ist um ein byte kuerzer (sogar ohne den Import).
PPS: Das mit properties ist so eine Sache, sie taeuschen Trivialitaet vor obwohl unter der Haube vllt. was kompliziertes passiert. Fuer intensive Berechnungen und Sachen die State aendern wuerde ich eine methode bevorzugen (vgl. dict.items() ist eine Methode weil es eben nicht trivial ist.).
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
BlackJack

Vielleicht ist `dict.items()` auch eine Methode weil es das schon viel länger gibt als es Properties in Python gibt.

Das mit Properties und Trivialität ist so eine Sache. Wenn man weiss, das es Properties gibt, muss man prinzipiell damit rechnen, dass ein Attributzugriff Berechnungen nach sich zieht. Im Grunde muss man das sogar ohne Properties, weil's ja `__getattr__()` gibt. Und vielleicht ist das Objekt, dass man da vor sich hat ein Proxy, der sich den Wert für das Attribut über's Netz von einem anderen Rechner holt. Das ist also nur eine Faustregel, dass man es vermeiden sollte längere Berechnungen bei Attributzugriffen anzustossen.

Den Zustand eines Objektes sollte man dagegen auch bei `get_*()`-Methoden nicht unbedingt ändern, denn das käme auch bei einer `get_gewicht()`-Methode etwas unerwartet.

Bei einem `gewicht`-Property würde ich es zum Beispiel noch legitim finden, wenn dabei das Gewicht durch aufaddieren von "Teilen des Objekts" berechnet würde. Ist letztendlich Geschmackssache.
halux
User
Beiträge: 11
Registriert: Samstag 28. März 2009, 17:06
Wohnort: Liesten

das hat ja super geklapt :D
habe mich für die Variante mit der for Schleife entschieden, weil für mich verständlich und einfach zu lesen.
Die einfachsten Dinge sind die Besten . . .

Danke halux :D
Antworten