Seite 1 von 1

Iteration über Object

Verfasst: Mittwoch 7. Juli 2010, 20:42
von Twilo
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

Re: Iteration über Object

Verfasst: Mittwoch 7. Juli 2010, 21:48
von yipyip
Es gibt doch "__iter__":

Code: Alles auswählen

...
  def __iter__(self):
    return iter(self.__xyz)
...
:wink:
yipyip

Re: Iteration über Object

Verfasst: Mittwoch 7. Juli 2010, 22:15
von mutetella
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:

Re: Iteration über Object

Verfasst: Donnerstag 8. Juli 2010, 11:10
von Twilo
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

Re: Iteration über Object

Verfasst: Donnerstag 8. Juli 2010, 11:14
von EyDu
So wie es in deinem Code steht. Du solltest dir übrigens die doppelten Tiefstriche vor deinen Attributen abgewöhnen.

Re: Iteration über Object

Verfasst: Donnerstag 8. Juli 2010, 11:19
von Twilo
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

Re: Iteration über Object

Verfasst: Donnerstag 8. Juli 2010, 11:24
von EyDu
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  

Re: Iteration über Object

Verfasst: Donnerstag 8. Juli 2010, 11:25
von cofi

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

Re: Iteration über Object

Verfasst: Donnerstag 8. Juli 2010, 11:27
von 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.

Re: Iteration über Object

Verfasst: Donnerstag 8. Juli 2010, 11:44
von Twilo
Hallo,

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

mfg
Twilo

Re: Iteration über Object

Verfasst: Donnerstag 8. Juli 2010, 12:13
von cofi
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.

Re: Iteration über Object

Verfasst: Donnerstag 8. Juli 2010, 12:14
von Rebecca
Du koenntest auch schon fast darueber nachdenken, von list zu erben. :)