just for fun: make a class (not its instances) iterable

Tim Chase python.list at tim.thechases.com
Wed Aug 10 02:29:30 CEST 2011


On 08/09/2011 07:11 PM, Terry Reedy wrote:
> On 8/9/2011 5:43 PM, Gelonida N wrote:
>> Now I wondered whether there is any way to  implement a class such, that
>> I can write
>>
>> for val in MyClass:
>> 	print val
>
> And what are the items in a class that you expect that to produce?

I can see doing something like

   class MyClass:
     instances = []
     def __init__(self, *args, **kwargs):
       self.instances.append(self)
       # ...

   a = MyClass(...)
   b = MyClass(...)
   for instance in MyClass:
     do_something(instance)

I was curious/surprised to find that

   class MyClass:
     instances = []
     @classmethod
     def __iter__(cls):
       for i in cls.instances:
         yield i
     def __init__(self):
       self.instances.append(self)

didn't work as I expected since MyClass then has an __iter__ 
property that should know about the class.

-tkc






More information about the Python-list mailing list