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()
Run Code Online (Sandbox Code Playgroud)
我有一个嵌入了名为 的可迭代成员变量的类self.set,我想让这个类支持for循环。上面是我为此目的编写的代码。但是,我认为必须有更好的方法来更轻松地完成此任务,因为该类已经有一个可迭代的成员。
问题> 有没有一种方法可以将工作委托给嵌入式self.set?另外,我认为也许还有一个很好的方法来实施__getitem__。
谢谢
我几乎可以肯定您不希望您的容器成为迭代器。所以,它不应该实施 __next__。相反,它应该是可迭代的,因此它只需要实现__iter__。在这种情况下,如果您想委托给可迭代成员:
def __iter__(self):
return iter(self.set)
Run Code Online (Sandbox Code Playgroud)
并删除你的__next__方法。