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 -- http://mail.python.org/mailman/listinfo/python-list