title: Python iterators – how to dynamically assign self.next within a new style class?
body: <p>As part of some WSGI middleware I want to write a python class that wraps an iterator to  implement a close method on the iterator.</p>
  
  <p>This works fine when I try it with an old-style class, but throws a TypeError when I try it with a new-style class. What do I need to do to get this working with a new-style class?</p>
  
  <p>Example:</p>
  
  <pre><code>class IteratorWrapper1:
  
      def __init__(self, otheriter):
          self._iterator = otheriter
          self.next = otheriter.next
  
      def __iter__(self):
          return self
  
      def close(self):
          if getattr(self._iterator, 'close', None) is not None:
              self._iterator.close()
          # other arbitrary resource cleanup code here
  
  class IteratorWrapper2(object):
  
      def __init__(self, otheriter):
          self._iterator = otheriter
          self.next = otheriter.next
  
      def __iter__(self):
          return self
  
      def close(self):
          if getattr(self._iterator, 'close', None) is not None:
              self._iterator.close()
          # other arbitrary resource cleanup code here
  
  if __name__ == "__main__":
      for i in IteratorWrapper1(iter([1, 2, 3])):
          print i
  
      for j in IteratorWrapper2(iter([1, 2, 3])):
          print j
  </code></pre>
  
  <p>Gives the following output:</p>
  
  <pre><code>1
  2
  3
  Traceback (most recent call last):
    ...
  TypeError: iter() returned non-iterator of type 'IteratorWrapper2'
  </code></pre>