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