gpt4 book ai didi

python - 如何使自定义对象可迭代?

转载 作者:太空狗 更新时间:2023-10-29 17:24:48 29 4
gpt4 key购买 nike

我有一个自定义类对象的列表(示例如下)。

使用:list(itertools.chain.from_iterable(myBigList)) 我想将所有 stations 子列表“合并”到一个大列表中。所以我想我需要让我的自定义类成为可迭代的。

这是我的自定义类的示例。

class direction(object) :
def __init__(self, id) :
self.id = id
self.__stations = list()

def __iter__(self):
self.__i = 0 # iterable current item
return iter(self.__stations)

def __next__(self):
if self.__i<len(self.__stations)-1:
self.__i += 1
return self.__stations[self.__i]
else:
raise StopIteration

我实现了 __iter____next__ 但它似乎不起作用。他们甚至没有被召唤。

知道我做错了什么吗?

注意:使用Python 3.3

最佳答案

__iter__ 是当您尝试迭代类实例时调用的内容:

>>> class Foo(object):
... def __iter__(self):
... return (x for x in range(4))
...
>>> list(Foo())
[0, 1, 2, 3]

__next__ 是在从 __iter__ 返回的对象上调用的(在 python2.x 上,它是 next,而不是 __next__——我通常给它们起别名,这样代码就可以与任何一个一起工作...):

class Bar(object):
def __init__(self):
self.idx = 0
self.data = range(4)
def __iter__(self):
return self
def __next__(self):
self.idx += 1
try:
return self.data[self.idx-1]
except IndexError:
self.idx = 0
raise StopIteration # Done iterating.
next = __next__ # python2.x compatibility.

在评论中,有人问你将如何构造可以迭代多次的对象。在这种情况下,我建议采用与 Python 相同的方法,将迭代器从数据容器中分离出来:

class BarIterator(object):
def __init__(self, data_sequence):
self.idx = 0
self.data = data_sequence
def __iter__(self):
return self
def __next__(self):
self.idx += 1
try:
return self.data[self.idx-1]
except IndexError:
self.idx = 0
raise StopIteration # Done iterating.


class Bar(object):
def __init__(self, data_sequence):
self.data_sequence = data_sequence
def __iter__(self):
return BarIterator(self.data_sequence)

关于python - 如何使自定义对象可迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665485/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com