Итераторы Python - как динамически назначать self.next в новом классе стилей?

Как часть некоторого промежуточного программного обеспечения WSGI, я хочу написать класс Python, который обертывает итератор для реализации метода close на итераторе.

Это прекрасно работает, когда я пытаюсь сделать это с классом старого стиля, но выдает ошибку TypeError, когда я пытаюсь сделать это с классом нового стиля. Что мне нужно сделать, чтобы это работало с классом нового стиля?

Пример:

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

Дает следующий вывод:

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

Ответы на вопрос(4)

Ваш ответ на вопрос