Iteratory Pythona - jak dynamicznie przypisywać self.next w nowej klasie stylów?

Jako część jakiegoś oprogramowania pośredniego WSGI chcę napisać klasę pythona, która opakowuje iterator, aby zaimplementować metodę close na iteratorze.

Działa to dobrze, gdy próbuję z klasą starego stylu, ale gdy próbuję z klasą nowego stylu, zgłasza błąd TypeError. Co muszę zrobić, aby pracować z klasą nowego stylu?

Przykład:

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

Daje następujące dane wyjściowe:

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

questionAnswers(4)

yourAnswerToTheQuestion