Itinerarios de Python: ¿cómo asignar dinámicamente self.next dentro de una nueva clase de estilo?

Como parte de algún middleware WSGI, quiero escribir una clase de python que envuelva un iterador para implementar un método de cierre en el iterador.

Esto funciona bien cuando lo intento con una clase de estilo antiguo, pero lanza un TypeError cuando lo intento con una clase de estilo nuevo. ¿Qué debo hacer para que esto funcione con una clase de nuevo estilo?

Ejemplo:

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

Da la siguiente salida:

1
2
3
Traceback (most recent call last):
  ...
TypeError: iter() returned non-iterator of type 'IteratorWrapper2'

Respuestas a la pregunta(4)

Su respuesta a la pregunta