Verschachteltes Attribut in Objekten und Listen

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
Benutzeravatar
Tompazi
User
Beiträge: 19
Registriert: Sonntag 2. August 2009, 10:05

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..
Zuletzt geändert von Tompazi am Samstag 21. November 2009, 16:35, insgesamt 2-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Benutzeravatar
Tompazi
User
Beiträge: 19
Registriert: Sonntag 2. August 2009, 10:05

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
Benutzeravatar
Tompazi
User
Beiträge: 19
Registriert: Sonntag 2. August 2009, 10:05

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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):
    # ...
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.
Antworten