启用Python类以支持循环内部可迭代成员变量

时间:2017-08-02 17:50:59

标签: python python-3.x

from sortedcontainers import SortedSet

class BigSet(object):
    def __init__(self):
        self.set = SortedSet()
        self.current_idx = -1

    def __getitem__(self, index):
        try:
            return self.set[index]
        except IndexError as e:
            print('Exception: Index={0} len={1}'.format(index, len(self.ord_set)))
            raise StopIteration

    def add(self, element):
        self.set.add(element)

    def __len__(self):
        return len(self.set)

    def __iter__(self):
        self.current_idx = -1
        return self

    def __next__(self):
        self.current_idx += 1
        if self.current_idx == len(self.set):
            raise StopIteration
        else:
            return self.set[self.current_idx]

def main():
    big = BigSet()
    big.add(1)
    big.add(2)
    big.add(3)

    for b in big:
        print(b)

    for b2 in big:
        print(b2)

if __name__ == "__main__":
    main()

我有一个嵌入名为self.set的可迭代成员变量的类,我想启用此类来支持for循环。以上是我为此目的编写的代码。但是,我认为必须有更好的方法来完成这项任务,因为类已经有了一个可迭代的成员。

问题>有没有办法可以将作业委托给嵌入式self.set?另外,我认为也许有一种很好的方法来实现__getitem__

谢谢

1 个答案:

答案 0 :(得分:2)

我几乎可以肯定你不希望你的容器是迭代器。因此,它应该不实现 __next__。相反,它应该是 iterable ,因此它只需要实现__iter__。在这种情况下,如果要委托给可迭代成员:

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

并删除您的__next__方法。