由於一些WSGI中間件的一部分,我想編寫一個包裝迭代器來實現的迭代器關閉方法Python類。Python的迭代器 - 如何動態一種新的風格類中分配self.next?
,當我和一箇舊式類試試這工作得很好,但拋出當我嘗試用一種新的風格類類型錯誤。我需要做些什麼才能使這個課程適合新式課程?
實施例:
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'
謝謝你的回答!也許我應該給出更多的上下文:我有一個包裝類的原因是,我可以爲返回的迭代器對象添加一個close方法,並且只是返回原始迭代器不會給我一個這樣的機會。 – ollyc 2009-07-20 08:36:24
我可以想到幾種我可能想要這樣做的情況。它們都是人爲的(也就是說,我從來沒有真的需要這樣做),所以我不打算列出它們,但這是一個完全有效的想要做的事情。 – 2009-07-20 08:44:24
另外,這不是猴子補丁。猴子修補正在從類的外部修改類的方法,而不是修改自己方法的類。 – 2009-07-20 08:47:43