2012-03-05 12 views
12

Tôi có một lớp trong python, có biến lặp như biến mẫu. Tôi muốn lặp lại các cá thể của lớp bằng cách lặp qua vòng lặp được nhúng.python làm cho lớp có thể lặp lại bằng cách trả về nhúng có thể lặp lại

tôi thực hiện điều này như sau:

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

tôi không thực sự cảm thấy rằng thoải mái gọi phương thức __iter__() trên iterable, vì nó là một phương pháp đặc biệt. Đây có phải là cách bạn sẽ giải quyết vấn đề này trong python hoặc là có một giải pháp thanh lịch hơn?

+1

Bạn có thể muốn theo dõi PEP 380 (http://www.python.org/dev/peps/pep-0380/) sẽ làm cho điều này có thể với '' lợi nhuận từ self._iterable'' (điều này được chấp nhận để đưa vào 3.3). –

Trả lời

22

Cách "tốt nhất" cho cách để ủy __iter__ sẽ là:

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

Cách khác, nó có thể là đáng được biết đến:

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

nào sẽ cho phép bạn fiddle với từng hạng mục trước khi trở về nó (ví dụ, nếu bạn muốn yield item * 2).

Và như @Lattyware đề cập trong các ý kiến, PEP380 (dự kiến ​​sẽ đưa vào Python 3.3) sẽ cho phép:

def __iter__(self): 
    yield from self._iterable 

Lưu ý rằng nó có thể là hấp dẫn để làm điều gì đó như:

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

Nhưng điều này sẽ không hoạt động: iter(foo) gọi phương thức __iter__ trực tiếp trên type(foo), bỏ qua foo.__iter__. Xem xét, ví dụ:

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

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

Bạn mong chờ rằng list(SurprisingIter()) sẽ trở ["a", "b", "c"], nhưng nó thực sự trở [1, 2, 3].

+0

có cảm ơn - trông đẹp hơn! – jzwiener

+0

Tổng quan toàn diện rất tốt! – kindall

+0

Có lỗi đánh máy trong biến thể PEP380 mà tôi thích. Nó phải là 'def __iter __ (self): năng suất từ ​​self._iterable' – kap