On Thu, 07 Jul 2005 09:51:42 +0200, Thomas Heller <[EMAIL PROTECTED]> wrote:
>[EMAIL PROTECTED] (Bengt Richter) writes: > >> On Wed, 06 Jul 2005 17:57:42 +0200, Thomas Heller <[EMAIL PROTECTED]> 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) [...] > >Yep, that's exactly what I need - thanks. > BTW, I forgot to mention that you could use property as a decorator in the above single-argument case: >>> class Base(object): ... @property ... def __iter__(self): ... if hasattr(self, "Iterator"): ... return self.Iterator ... raise AttributeError, name ... >>> 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] Hope there isn't a gotcha for your use case in the way an instance attribute of the same name is allowed. A custom descriptor could eliminate that. >>> inst = Concrete() >>> list(iter(inst)) [1, 2, 3] >>> inst.__init__ = 'abc' >>> list(iter(inst)) [1, 2, 3] >>> inst.__init__ 'abc' Regards, Bengt Richter -- http://mail.python.org/mailman/listinfo/python-list