Iteradores Python - como atribuir dinamicamente self.next dentro de uma nova classe de estilo?

Como parte de algum middleware WSGI, quero escrever uma classe python que envolva um iterador para implementar um método close no iterador.

Isso funciona bem quando eu tento com uma classe de estilo antigo, mas lança um TypeError quando eu tento com uma classe de novo estilo. O que preciso fazer para que isso funcione com uma nova classe de estilo?

Exemplo:

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

Dá a seguinte saída:

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

questionAnswers(4)

yourAnswerToTheQuestion