semisiu
2007-11-09 22:45:23 UTC
Witam :)
Jestem początkującym pythonowcem i mam pytanie w związku z obiektami
iterowalnymi. Wyobraźmy sobie, że mam taką klasę:
class Zwierzatka:
def __init__(self):
self._lista = []
def dodaj(self, imie, wiek):
self._lista.append({'imie': imie, 'wiek': wiek})
def __iter__(self):
return self._lista.__iter__()
zw = Zwierzatka()
# Dodajemy sobie zwierzatka.
zw.dodaj('Azor', 7)
zw.dodaj('Burek', 11)
zw.dodaj('Koko', 9)
zw.dodaj('Wandzia', 8)
# Wypisujemy nasze zwierzatka.
for z in zw:
print z['imie'], z['wiek']
Czy taka definicja Zwierzątek jest poprawna? Czy powinienem
zaimplementować metodę next()? Pytam, bo Python Library Reference
wyraźnie mówi, że obiekty iterowane muszą implementować metody
__iter__() oraz next(), natomiast moje Zwierzątka nie mają metody
next() i wszystko gra. Czy może mylę tutaj pojęcia "iteratora" i
"obiektu iterowalnego"? Czy chodzi tutaj o to, że self._lista jest
"iteratorem" (i dlatego musi mieć metodę `next()`), a `zw` jest
"obiektem iterowalnym" poprzez posiadanie metody __iter__() (i dlatego
nie musi mieć metody `next()`)? Co, jeśli bym do Zwierzątek dodał
metodę next() - czy i kiedy byłaby ona wywoływana?
Z nieco innej beczki: czy takie iterowanie obiektów jest w ogóle
"eleganckie", czy może lepiej dawać klasom metodę np "wezIterator()" i
wówczas w pętli pisać:
for z in zw.wezIterator():
print z['imie'], z['wiek']
zwłaszcza przy bardziej skomplikowanych klasach? Imho po to stworzono
w pythonie protokół iteracyjny, ale może się mylę.
Wybaczcie banalne pytania, ale nikt chyba nie powiedział, że takowych
nie wolno zadawać na grupach ;-)
Pozdrawiam,
Michał :)
Jestem początkującym pythonowcem i mam pytanie w związku z obiektami
iterowalnymi. Wyobraźmy sobie, że mam taką klasę:
class Zwierzatka:
def __init__(self):
self._lista = []
def dodaj(self, imie, wiek):
self._lista.append({'imie': imie, 'wiek': wiek})
def __iter__(self):
return self._lista.__iter__()
zw = Zwierzatka()
# Dodajemy sobie zwierzatka.
zw.dodaj('Azor', 7)
zw.dodaj('Burek', 11)
zw.dodaj('Koko', 9)
zw.dodaj('Wandzia', 8)
# Wypisujemy nasze zwierzatka.
for z in zw:
print z['imie'], z['wiek']
Czy taka definicja Zwierzątek jest poprawna? Czy powinienem
zaimplementować metodę next()? Pytam, bo Python Library Reference
wyraźnie mówi, że obiekty iterowane muszą implementować metody
__iter__() oraz next(), natomiast moje Zwierzątka nie mają metody
next() i wszystko gra. Czy może mylę tutaj pojęcia "iteratora" i
"obiektu iterowalnego"? Czy chodzi tutaj o to, że self._lista jest
"iteratorem" (i dlatego musi mieć metodę `next()`), a `zw` jest
"obiektem iterowalnym" poprzez posiadanie metody __iter__() (i dlatego
nie musi mieć metody `next()`)? Co, jeśli bym do Zwierzątek dodał
metodę next() - czy i kiedy byłaby ona wywoływana?
Z nieco innej beczki: czy takie iterowanie obiektów jest w ogóle
"eleganckie", czy może lepiej dawać klasom metodę np "wezIterator()" i
wówczas w pętli pisać:
for z in zw.wezIterator():
print z['imie'], z['wiek']
zwłaszcza przy bardziej skomplikowanych klasach? Imho po to stworzono
w pythonie protokół iteracyjny, ale może się mylę.
Wybaczcie banalne pytania, ale nikt chyba nie powiedział, że takowych
nie wolno zadawać na grupach ;-)
Pozdrawiam,
Michał :)