2012-03-05 78 views
12

我有一個Python中的類,它有一個可迭代的實例變量。我想通過遍歷嵌入式迭代器迭代類的實例。python使類迭代返回嵌入迭代

我實現了這個如下:

def __iter__(self): 
    return self._iterable.__iter__() 

我真的不覺得舒服調用__iter__()方法上的迭代,因爲它是一種特殊的方法。這是你如何解決這個問題在python中還是有一個更優雅的解決方案?

+1

你可能想要關注PEP380(http://www.python.org/dev/peps/pep-0380/),它可以通過'self._iterable'產生這個可能(this被接納列入3.3)。 – 2012-03-05 20:44:53

回答

22

「最好」的方式的方式來委託__iter__是:

def __iter__(self): 
    return iter(self._iterable) 

或者,它可能是值得了解:

def __iter__(self): 
    for item in self._iterable: 
     yield item 

這將讓你與每個項目撥弄返回前它(例如,如果你想yield item * 2)。

而作爲@Lattyware在評論中提到,PEP380(預計列入的Python 3.3)將允許:

def __iter__(self): 
    yield from self._iterable 

注意,它可能是很有誘惑力的做一些事情,如:

def __init__(self, iterable): 
    self.__iter__ = iterable.__iter__ 

但是這個將不起作用iter(foo)直接調用方法type(foo),繞過foo.__iter__。舉個例子:

class SurprisingIter(object): 
    def __init__(self): 
     self.__iter__ = lambda self: iter("abc") 

    def __iter__(self): 
     return iter([1, 2, 3]) 

你會認爲list(SurprisingIter())將返回["a", "b", "c"],但它實際上返回[1, 2, 3]

+0

是的,謝謝 - 看起來更好! – jzwiener 2012-03-05 20:40:41

+0

非常好的綜合概述! – kindall 2012-03-05 20:57:29

+0

PEP380變體中有一個錯字,我更喜歡。它應該是'def __iter __(self):來自self._iterable' – kap 2015-07-10 08:49:35