Seite 1 von 1

Verschachteltes Attribut in Objekten und Listen

Verfasst: Samstag 21. November 2009, 15:39
von Tompazi
Ich versuche an ein Attribut (Attribut1_1) eines Objektes (Objekt1) das in einer Liste eines anderen Objekts (Objekt2.Attribut2_2) welches wiederum in einer Liste (Objekt2_Liste) gespeichert ist heranzukommen.
(Letzte Zeile ist das Problem)

Code: Alles auswählen

class Objekt1(object):
    def __init__(self,Attribut1_1):
        self.Attribut1_1 = Attribut1_1

class Objekt2(object):
    def __init__(self,Attribut2_1):
        self.Attribut2_1 = Attribut2_1
        self.Attribut2_2 = []
        for i in range(5):
            self.Attribut2_2.append(Objekt1_Liste.pop())

Objekt1_Liste=[]
for i in range(10):
    Objekt1_Liste.append(Objekt1(i))

Objekt2_Liste=[]
for i in range(2):
    Objekt2_Liste.append(Objekt2(i))

#Alle Attribut1_1 in allen Objekt2.Attribut2_2, funktioiniert.
for Objekt2 in Objekt2_Liste: 
    for Objekt1 in Objekt2.Attribut2_2:
        print Objekt1.Attribut1_1

#Ein bestimmtes Attribut1_1, geht so nicht:
Objekt2_Liste[1].Objekt2.Attribut2_2[3].Objekt1.Attribut1_1
Wie geht das? am Besten in einer Zeile?

MfG Tompazi

PS: Sorry, für den umständlichen Satz..

Re: Verschachteltes Attribut in Objekten und Listen

Verfasst: Samstag 21. November 2009, 15:44
von /me
Tompazi hat geschrieben: (Letzte Zeile ist das Problem)

Code: Alles auswählen

#Ein bestimmtes Attribut1_1, geht so nicht:
Objekt2_Liste[1].Objekt2.Attribut2_2[3].Objekt1.Attribut1_1
Du hast die Namen der Klassen noch mit eingebaut.

Verfasst: Samstag 21. November 2009, 15:44
von ms4py

Code: Alles auswählen

Objekt2_Liste[1].Attribut2_2[3].Attribut1_1
Du solltest dir nochmal die entsprechenden Stellen zu OO im Tutorial anschauen, dir fehlen noch wichtige Grundlagen!
Außerdem wäre ein Blick auf PEP8 auch nicht schlecht.

Verfasst: Samstag 21. November 2009, 16:18
von Tompazi
ice2k3 hat geschrieben: Du solltest dir nochmal die entsprechenden Stellen zu OO im Tutorial anschauen, dir fehlen noch wichtige Grundlagen!
Außerdem wäre ein Blick auf PEP8 auch nicht schlecht.
Danke, Ich weiß :oops:
werd ich machen

MfG Tompazi

Verfasst: Samstag 21. November 2009, 16:41
von Tompazi
Noch ein Problem: Ich will überprüfen ob ein bestimmter Wert in einem von allen Attribut1_1 enthalten ist.

also

Code: Alles auswählen

if 5 in Objekt2_Liste[1].Attribut2_2[ ? ].Attribut1_1:
... 
Wie kann ich die ganze Attribut2_2 Liste nach einem bestimmten Attribut1_1 Wert suchen lassen?

MfG Tompazi

PS: Sorry für Doppelpost

Verfasst: Samstag 21. November 2009, 17:12
von Darii
Naja, am simpelsten durch eine for-Schleife.

Code: Alles auswählen

in_list = False
for item in Objekt2_Liste[1].Attribut2_2:
    if 5 == item.Attribut1_1: in_list = True; break
if in_list:
    #...
oder auch eleganter als Einzeiler:

Code: Alles auswählen

if any(5 == item.Attribut1_1 for item in Objekt2_Liste[1].Attribut2_2):
    # ...

Verfasst: Samstag 21. November 2009, 17:21
von BlackJack
@Tompazi: Es sieht mir allerdings alles etwas zu komplex aus, und nicht wirklich nach OOP. Solche langen "Attributdurchgriffe" legen eine schlechte Kapselung nahe.

Nochmal zum Ausgangsquelltext: `Objekt2.__init__()` sollte nicht auf `Objekt1_Liste` zugreifen. Das ist ein völlig anderes Objekt ausserhalb der Klasse, von dem einfach so erwartet wird, dass es auf Modulebene existiert. Und umgekehrt würde niemand damit rechnen, dass die Erstellung eines `Objekt2`-Exemplars einfach so ungefragt eine externe Liste verändert.

Ab Zeile 20 bindest Du die Namen `Objekt1` und `Objekt2` neu, dass heisst ab Da kannst Du unter den Namen nicht mehr auf die jeweiligen Klassen zugreifen. Auch sehr unsauber und verwirrend.