Iteration über Object

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,

ich suche in Python 2.5 udn 2.6 die Möglichkeit über ein Object zu iterieren, zurückgegeben werden soll eine Liste.

Code: Alles auswählen

class Test1:
    def __init__(self):
        self.__xyz = [1,2,3,4,5,6,7,8,9,10] # Beispieldaten
        
    def __len__(self):
        return len(self.__xyz)     
        
    def __???__(self):
        return self.__xyz

class Test2(Test1):
    def __init__(self):
        Test1.__init__(self)
        self.__zyx = [9,8,7,6,5,4,3,2,1] # Beispieldaten
        
    def __len__(self):
        return len(self.__zyx)
        
    def __???__(self):
        return self.__zyx

test1 = Test1()
test2 = Test2()

print len(test1) # Ausgabe von 10
print len(test2) # Ausgabe von 9

for i in test1:
    print i # Ausgabe von __xyz 1,2,3,4,5,6,7,8,9,10

for i in test2:
    print i # Ausgabe von __zyx 9,8,7,6,5,4,3,2,1
mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Es gibt doch "__iter__":

Code: Alles auswählen

...
  def __iter__(self):
    return iter(self.__xyz)
...
:wink:
yipyip
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

wenn ich Dich richtig verstehe, meinst Du das:

Code: Alles auswählen

class Test1:
    def __init__(self):
        self.__xyz = [1,2,3,4,5,6,7,8,9,10] # Beispieldaten
       
    def __len__(self):
        return len(self.__xyz)    
       
    def __iter__(self):
        return iter(self.__xyz)

class Test2(Test1):
    def __init__(self):
        Test1.__init__(self)
        self.__zyx = [9,8,7,6,5,4,3,2,1] # Beispieldaten
       
    def __len__(self):
        return len(self.__zyx)
       
    def __iter__(self):
        return iter(self.__zyx)
Gruß
mutetella


EDIT: uuups.... yipyip war wohl schneller... :wink:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,

ich möchte noch die Möglichkeit haben auf einen bestimmten index z.B. "test1[1]" zuzugreifen.

Code: Alles auswählen

class Test1:
    def __init__(self):
        self.__xyz = [1,2,3,4,5,6,7,8,9,10] # Beispieldaten
        
    def __len__(self):
        return len(self.__xyz)     
        
    def __iter__(self):
        return iter(self.__xyz)

    def __getitem__(self, index):
        return self.__xyz[index]

test1 = Test1()
print len(test1)

for i in test1: print i

print test1[1]

Code: Alles auswählen

In [7]: print test1[1]
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)

/home/user/<ipython console> in <module>()

AttributeError: Test1 instance has no attribute '__getitem__'
wie müsste ich __getitem__ implementieren?

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

So wie es in deinem Code steht. Du solltest dir übrigens die doppelten Tiefstriche vor deinen Attributen abgewöhnen.
Das Leben ist wie ein Tennisball.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,
EyDu hat geschrieben:So wie es in deinem Code steht. Du solltest dir übrigens die doppelten Tiefstriche vor deinen Attributen abgewöhnen.
die Eigenschaft darf von ausserhalb nicht verändert werden. Wie soll mir das ändern in ohne Unterstriche bei mein Problem weiterhelfen?

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das entfernen der doppelten Unterstriche hilft dir bei deinem Problem gar nicht, sie sind nur nicht dafür gedacht Attribute als private zu markieren. Dazu benutzt man einfache Unterstriche. Du hast übrigens noch immer kein Problem:

Code: Alles auswählen

>>> class Spam:                                                                              
...     def __getitem__(self, index):
...         return 0                                                                         
...                                                                                          
>>> s = Spam()                                                                               
>>> s[0]                                                                                     
0  
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

test = Test1()
test._Test1__xyz = "HarHar!"
Dein Code laesst sich per Copy+Paste in ipython nicht ausfuehren, weil die Leerzeile zwischen `__iter__` und `__getitem__` nicht eingerückt ist, im Gegensatz zu den anderen.

Edit: Zum "name mangling" (doppelte, fuehrende Unterstriche) mehr unter http://docs.python.org/tutorial/classes ... -variables
BlackJack

@Twilo: Bei Deinem Problem hilft es nicht weiter, aber es ist halt "unpythonisch". Ein Unterstrich reicht um zu sagen dass man da von aussen nicht dran gehen soll. Wer das doch will, wird es auch bei den zwei Unterstrichen machen. Ist ja nicht so als wenn man da nicht auch einfach rankäme:

Code: Alles auswählen

In [92]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:class Test1:
:    def __init__(self):
:        self.__xyz = [1,2,3,4,5,6,7,8,9,10] # Beispieldaten
:
:    def __len__(self):
:        return len(self.__xyz)
:
:    def __iter__(self):
:        return iter(self.__xyz)
:
:    def __getitem__(self, index):
:        return self.__xyz[index]
:--

In [93]: a = Test1()

In [94]: a._Test1__xyz
Out[94]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

In [95]: a[5]
Out[95]: 6
Und hier sieht man auch dass Du Dein Problem im Grunde schon gelöst hast. Der Quelltext der Klasse ist 1:1 aus Deinem letzten Beitrag kopiert.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,

hm... ich Frage mich, warum es beim Reinkopieren des Codes in ipython zum Fehler kommt.

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wuhu macht das Spass sich selbst zu zitieren:
cofi hat geschrieben:Dein Code laesst sich per Copy+Paste in ipython nicht ausfuehren, weil die Leerzeile zwischen `__iter__` und `__getitem__` nicht eingerückt ist, im Gegensatz zu den anderen.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Du koenntest auch schon fast darueber nachdenken, von list zu erben. :)
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten