Conditionally implementing __iter__ in new style classes

Thomas Heller theller at python.net
Thu Jul 7 03:51:42 EDT 2005


bokr at oz.net (Bengt Richter) writes:

> On Wed, 06 Jul 2005 17:57:42 +0200, Thomas Heller <theller at python.net> wrote:
>
>>I'm trying to implement __iter__ on an abstract base class while I don't
>>know whether subclasses support that or not.

> Will a property or custom descriptor do what you want? E.g.
>
>  >>> class Base(object):
>  ...     def __getIter(self):
>  ...         if hasattr(self, "Iterator"):
>  ...             return self.Iterator
>  ...         raise AttributeError, name
>  ...     __iter__ = property(__getIter)
>  ...
>  >>> class Concrete(Base):
>  ...     def Iterator(self):
>  ...         yield 1
>  ...         yield 2
>  ...         yield 3
>  ...
>  >>> iter(Base())
>  Traceback (most recent call last):
>    File "<stdin>", line 1, in ?
>  TypeError: iteration over non-sequence
>  >>> iter(Concrete())
>  <generator object at 0x02EF152C>
>  >>> list(iter(Concrete()))
>  [1, 2, 3]

Yep, that's exactly what I need - thanks.

Thomas



More information about the Python-list mailing list