Seite 1 von 1

Zugriff auf Attribute

Verfasst: Freitag 23. Mai 2008, 09:35
von Martin Kalbfuß
Hallo Zusammen.
Ich will eine Liste von Attributen erhalten. Eine möglichkeit habe ich schon über getattr und map gefunden.

Also:

Code: Alles auswählen


class Test:

	def __init__(self, Attribut):

		self.Attribut = Attribut


Objekte = [Test(1), Test(2), Test(3), Test(4)]

Attribute = map(lambda Objekt: getattr(Objekt, 'Attribut'), Objekte)

print Attribute

Geht das auch einfacherer?

Verfasst: Freitag 23. Mai 2008, 10:22
von fred.reichbier
Hallo, willkommen im Forum!

Diese Zeile:

Code: Alles auswählen

Attribute = map(lambda Objekt: getattr(Objekt, 'Attribut'), Objekte) 
solltest du durch eine List Comprehension:

Code: Alles auswählen

Attribute = [getattr(Objekt, 'Attribut') for Objekt in Objekte]
ersetzen können :)

Gruß Fred

Re: Zugriff auf Attribute

Verfasst: Freitag 23. Mai 2008, 10:49
von keppla
Sofern nicht der Name des Attributs zur Programmierzeit unbekannt ist (geht irgendwie aus deinem Text nicht hervor), könntest du das auch so machen:

Code: Alles auswählen

Attribute = [obj.Attribut for obj in Objekte]
Und bitte, halte dich an die Styleguides (pep 8), zumindest in sofern, dass Identifier klein geschrieben werden, sofern sie keine Klassen sind.

Verfasst: Freitag 23. Mai 2008, 11:09
von EyDu
@fred.reichbier: Warum sollte ich denn ein map durch eine LC ersetzen, wenn map genau das geforderte tut?

Code: Alles auswählen

import operator
attributes = map(operator.attrgetter('attribute'), objects)

Verfasst: Freitag 23. Mai 2008, 11:18
von fred.reichbier
Weil ich List Comprehensions so schön finde :K

Danke

Verfasst: Freitag 23. Mai 2008, 21:10
von Martin Kalbfuß
Super. Diese Antworten waren mehr als ausreichend. Wieder was gelehrnt über Python.

Verfasst: Freitag 23. Mai 2008, 21:24
von EyDu
Ja, so eine LC macht wirklich was her und gegen persönliche Präferenzen kann man natürlich nicht viel sagen. Immerhin ordne ich meine Importe ja auch sinnvoll nach deren Länge :roll: