new.instancemethod __iter__

Christian Heimes lists at cheimes.de
Sun Feb 7 00:54:44 CET 2010


Martin Drautzburg wrote:
> The first case does what I expected, i.e. it iterates over whatever f()
> yields. In the second case nothing is printed. I have the impression
> that it still calls the original __iter__() method (the one defined at
> the class level).
>
> Why is that so?
> How can I replace the __iter__() method so it does what I want.

Virtually all __magic__ methods are looked up on the type, not the
instance. So obj.__iter__() translates into type(obj).__iter__(obj).

If you *really* need to overwrite __iter__ on your instance rather than
defining it on your class, you need to proxy the method call:

class MyObject(object):
   def __iter__(self):
      return self.myiter()

obj = MyObject()
obj.myiter = myiter

That should do the trick.

Christian



More information about the Python-list mailing list