python - 使 Python 类支持 for 循环通过内部可迭代成员变量

标签 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 循环。上面是我为此目的编写的代码。但是,我认为必须有更好的方法来更轻松地完成此任务,因为该类已经有一个可迭代的成员。

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

谢谢

最佳答案

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

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

并删除您的 __next__方法。

关于python - 使 Python 类支持 for 循环通过内部可迭代成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45467785/

相关文章:

python - 文件是如何实现的?

python - 模拟 pytest 的 Sqlalchemy session

python - 电视节目 | client.get_participants ('test' )

python - 将 long for 语句缩短到最多 79 列的正确方法

python-3.x - 如何在使用带有 for 循环的请求时忽略 HTTP 错误?

python-3.x - 在ubuntu上安装没有pip的python

python - 从线程目标访问 `self`

Python 模块名称错误

python - 尝试使用 Python 中的 REST API 在 Atlassian Bitbucket 中创建拉取请求

python - 如何一次创建多个数组