on 18.04.2007 07:39 Steven D'Aprano said the following: > I thought that an iterator was any object that follows the iterator
replace object with "instance of a class", i.e. the relevant methods are looked up in the __class__ not in the instance (I think). I had the same troubles trying to dynamically reassign a __call__ method... > protocol, that is, it has a next() method and an __iter__() method. > > But I'm having problems writing a class that acts as an iterator. I have: > > class Parrot(object): > def __iter__(self): > return self > def __init__(self): > self.next = self._next() > def _next(self): > for word in "Norwegian Blue's have beautiful plumage!".split(): > yield word Try this:: class Parrot(object): def __iter__(self): return self def __init__(self): self.__class__.next = self._next().next # see post by I V def _next(self): for word in "Norwegian Blue's have beautiful plumage!".split(): yield word This works but practically forces the class to be used as a singleton... not very helpful :) Better: * use the '__iter__ returns/is a generator' way, * or if you need the object to be the iterator, implement the next method directly on the class:: class Parrot(object): def _next(self): for word in "Norwegian Blue's have beautiful plumage!".split(): yield word def __iter__(self): self.generator = self._next() return self def next(self): return self.generator.next() cheers, stefan -- http://mail.python.org/mailman/listinfo/python-list